swr2.0/
swr2.0/area/
swr2.0/boards/
swr2.0/clans/
swr2.0/doc/
swr2.0/planets/
swr2.0/spacecraft/
#ifndef _MUD_H_
#define _MUD_H_

#include <swr_support.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <zlib.h>

#ifndef __MORPHOS__
#include <math.h> /* built-in */
#endif

#include <time.h>

extern FILE *out_stream;

typedef	int				ch_ret;
typedef	int				obj_ret;

#ifdef __cplusplus
#define DECLARE_DO_FUN( fun )    extern "C" { DO_FUN    fun; } DO_FUN fun##_mangled
#define DECLARE_SPEC_FUN( fun )  extern "C" { SPEC_FUN  fun; } SPEC_FUN fun##_mangled
#define DECLARE_SPELL_FUN( fun ) extern "C" { SPELL_FUN fun; } SPELL_FUN fun##_mangled
#else
#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

/*
 * Structure types.
 */
typedef struct	affect_data		AFFECT_DATA;
typedef struct	area_data		AREA_DATA;
typedef struct  auction_data            AUCTION_DATA; /* auction data */
typedef struct	ban_data		BAN_DATA;
typedef struct	extracted_char_data	EXTRACT_CHAR_DATA;
typedef struct	char_data		CHAR_DATA;
typedef struct	hunt_hate_fear		HHF_DATA;
typedef struct	fighting_data		FIGHT_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	mob_index_data		MOB_INDEX_DATA;
typedef struct	note_data		NOTE_DATA;
typedef struct	board_data		BOARD_DATA;
typedef struct	obj_data		OBJ_DATA;
typedef struct	obj_index_data		OBJ_INDEX_DATA;
typedef struct	pc_data			PC_DATA;
typedef struct	room_index_data		ROOM_INDEX_DATA;
typedef struct	shop_data		SHOP_DATA;
typedef struct	repairshop_data		REPAIR_DATA;
typedef struct	time_info_data		TIME_INFO_DATA;
typedef struct	hour_min_sec		HOUR_MIN_SEC;
typedef struct	weather_data		WEATHER_DATA;
typedef struct  planet_data		PLANET_DATA;
typedef struct  guard_data		GUARD_DATA;
typedef struct  space_data              SPACE_DATA;
typedef	struct	clan_data		CLAN_DATA;
typedef struct  ship_data               SHIP_DATA;
typedef struct  hangar_data             HANGAR_DATA;
typedef struct  turret_data             TURRET_DATA;
typedef struct  ship_prototype_data     SHIP_PROTOTYPE;
typedef struct  missile_data            MISSILE_DATA;
typedef struct	mob_prog_data		MPROG_DATA;
typedef struct	mob_prog_act_list	MPROG_ACT_LIST;
typedef	struct	editor_data		EDITOR_DATA;
typedef struct	teleport_data		TELEPORT_DATA;
typedef struct	timer_data		TIMER;
typedef struct  vote_data		VOTE_DATA;
typedef struct	system_data		SYSTEM_DATA;
typedef	struct	smaug_affect		SMAUG_AFF;
typedef struct  who_data                WHO_DATA;
typedef	struct	skill_type		SKILLTYPE;
typedef	struct	social_type		SOCIALTYPE;
typedef	struct	cmd_type		CMDTYPE;
typedef	struct	killed_data		KILLED_DATA;

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

#define COMPRESS_BUF_SIZE MAX_STRING_LENGTH

#define DUR_CONV	23.333333333333333333333333

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

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

#define MAX_KILLTRACK		20	/* track mob vnums killed */

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

#define MAX_REXITS		   20	/* Maximum exits allowed in 1 room */
#define MAX_SKILL		  276
#define MAX_LEVEL		  105
#define MAX_CLAN		   50
#define MAX_PLANET		  100
#define MAX_SHIP                 1000
#define MAX_SHIP_ROOMS             25

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

#define CLINIC_HEAL_BONUS 2; /* Amount of healing bonus medical clinics give */


/**
 * Price constants
 */
#define CLONE_PRICE 5000 /* Price to update a clone */

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

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

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

/* defines for new do_who */
#define WT_MORTAL 0
#define WT_IMM    2
#define WT_AVATAR 1
#define WT_NEWBIE 3

typedef enum
  {
    DISASTER_ALIEN_INVASION
  } disaster_scenarios;

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

/*
 * Site ban structure.
 */
struct ban_data
{
    BAN_DATA *	next;
    BAN_DATA *	prev;
    char *	name;
    int		level;
    char *	ban_time;
};

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

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

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

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

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

/*
 * Connected state for a channel.
 */
typedef enum
{
  CON_PLAYING,          CON_GET_NAME,           CON_GET_OLD_PASSWORD,
  CON_CONFIRM_NEW_NAME, CON_GET_NEW_PASSWORD,   CON_CONFIRM_NEW_PASSWORD,
  CON_GET_NEW_SEX,      CON_DONE_MOTD,          CON_EDITING,
  CON_GET_WANT_RIPANSI, CON_READ_IMOTD,         CON_ADD_SKILLS,
  CON_READ_NMOTD,	CON_COPYOVER_RECOVER
} connection_types;

/*
 * Character substates
 */
typedef enum
{
  SUB_NONE,         SUB_PERSONAL_DESC, SUB_OBJ_LONG,
  SUB_OBJ_EXTRA,    SUB_MOB_DESC,      SUB_ROOM_DESC,
  SUB_ROOM_EXTRA,   SUB_WRITING_NOTE,  SUB_MPROG_EDIT,
  SUB_HELP_EDIT,    SUB_PERSONAL_BIO,  SUB_RESTRICTED,
  SUB_SHIPDESC,     SUB_CLANDESC,
  /* timer types ONLY below this point */
  SUB_TIMER_DO_ABORT = 128, SUB_TIMER_CANT_ABORT
} char_substates;

/*
 * Descriptor (channel) structure.
 */
struct descriptor_data
{
  DESCRIPTOR_DATA *next;
  DESCRIPTOR_DATA *prev;
  DESCRIPTOR_DATA *snoop_by;
  CHAR_DATA *character;
  CHAR_DATA *original;
  char *host;
  int port;
  SOCKET descriptor;
  short connected;
  short	idle;
  bool fcommand;
  char inbuf[MAX_INBUF_SIZE];
  char incomm[MAX_INPUT_LENGTH];
  char inlast[MAX_INPUT_LENGTH];
  int repeat;
  char *outbuf;
  unsigned long	outsize;
  int outtop;
  char *pagebuf;
  unsigned long	pagesize;
  int pagetop;
  char *pagepoint;
  signed char pagecmd;
  char pagecolor;
  int newstate;
  unsigned char	prevcolor;
  char *terminal_type;
  char telbuf[MAX_INPUT_LENGTH];
  int teltop;
  short cols;
  short rows;
  z_stream *mccp;
};

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

struct	int_app_type
{
    short	learn;
};

struct	wis_app_type
{
    short	practice;
};

struct	dex_app_type
{
    short	defensive;
};

struct	con_app_type
{
    short	hitp;
    short	shock;
    short	stun;
};

struct	cha_app_type
{
    short	charm;
};

struct  lck_app_type
{
    short	luck;
};

struct  frc_app_type
{
    short	force;
};

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

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

#define INIT_WEAPON_CONDITION    12
#define MAX_ITEM_IMPACT		 30

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

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

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

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

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


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

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

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

extern bool MOBtrigger;

typedef enum {PLAYER_SHIP, MOB_SHIP} ship_types;
typedef enum {SHIP_DOCKED, SHIP_READY, SHIP_BUSY, SHIP_BUSY_2, SHIP_BUSY_3, SHIP_REFUEL,
              SHIP_LAUNCH, SHIP_LAUNCH_2, SHIP_LAND, SHIP_LAND_2, SHIP_HYPERSPACE, SHIP_DISABLED, SHIP_FLYING} ship_states;
typedef enum {MISSILE_READY, MISSILE_FIRED, MISSILE_RELOAD, MISSILE_RELOAD_2, MISSILE_DAMAGED} missile_states;

typedef enum {SPACECRAFT, SPACE_STATION, AIRCRAFT, BOAT, SUBMARINE, LAND_VEHICLE } ship_classes;

static const long SPACECRAFT_BASE_PRICE = 10000;
static const long AIRCRAFT_BASE_PRICE = 5000;
static const long SUBMARINE_BASE_PRICE = 5000;
static const long SPACESTATION_BASE_PRICE = 100000;
static const long DEFAULT_CRAFT_BASE_PRICE = 2000;

typedef enum {FIGHTER1, SHUTTLE1, TRANSPORT1, 
              FIGHTER2, SHUTTLE2, TRANSPORT2,
              CORVETTE, FRIGATE, DESTROYER, 
              CRUISER, BATTLESHIP, FLAGSHIP, 
              CUSTOM_SHIP } ship_models;
typedef enum { MOB_PATROL = 0, MOB_DESTROYER = 6, MOB_CRUISER = 8, MOB_BATTLESHIP = 10 } mob_ship_models;

#define MAX_SHIP_MODEL	CUSTOM_SHIP

struct	model_type
{
  const char * name;
  short      hyperspeed;
  short      realspeed;
  short      missiles;
  short      lasers;
  short      tractorbeam;
  short      manuever;
  int         energy;
  int         shield;
  int         hull;
  short      rooms;
  void (*room_builder)( SHIP_DATA *ship, ROOM_INDEX_DATA *room[] );
};

#define LASER_DAMAGED    -1
#define LASER_READY       0

#define NEWBIE_STARSYSTEM 	"Terra Prime"

struct space_data
{
  SPACE_DATA * next;
  SPACE_DATA * prev;
  SHIP_DATA  * first_ship;
  SHIP_DATA  * last_ship;
  MISSILE_DATA  * first_missile;
  MISSILE_DATA  * last_missile;
  PLANET_DATA * first_planet;
  PLANET_DATA * last_planet;
  char       * filename;
  char       * name;
  char       * star1;
  char       * star2;
  Vector3 star1_pos;
  Vector3 star2_pos;
  int          crash;
};

struct guard_data
{
    GUARD_DATA * next;
    GUARD_DATA * prev;
    GUARD_DATA * next_on_planet;
    GUARD_DATA * prev_on_planet;
    CHAR_DATA  * mob;
    ROOM_INDEX_DATA * reset_loc;
    PLANET_DATA * planet;
};

struct  planet_data
{
  PLANET_DATA    * next;
  PLANET_DATA    * prev;
  PLANET_DATA    * next_in_system;
  PLANET_DATA    * prev_in_system;
  GUARD_DATA     * first_guard;
  GUARD_DATA     * last_guard;
  SPACE_DATA     * starsystem;
  AREA_DATA      * area;
  char           * name;
  char           * filename;
  CLAN_DATA      * governed_by;
  int 	     population;
  float            pop_support;
  int		     sector;
  Vector3 pos;
  int              size;
  int		     citysize;
  int              wilderness;
  int		     wildlife;
  int		     farmland;
  int		     barracks;
  int		     controls;
};

struct	clan_data
{
    CLAN_DATA * next;		/* next clan in list			*/
    CLAN_DATA * prev;		/* previous clan in list		*/
    char *	filename;	/* Clan filename			*/
    char *	name;		/* Clan name				*/
    char *	description;	/* A brief description of the clan	*/
    char *	leaders;
    char *	atwar;		/* Clan name				*/
    short	members;	/* Number of clan members		*/
    long int    funds;
    int         spacecraft;
    int		vehicles;
    int		salary;
};

struct ship_prototype_data
{
    SHIP_PROTOTYPE * next;
    SHIP_PROTOTYPE * prev;
    char *      filename;
    char *      name;
    char *      description;
    short      ship_class;
    short      model;
    short      hyperspeed;
    short      realspeed;
    short      maxmissiles;
    short      lasers;
    short      tractorbeam;
    short      manuever;
    int         maxenergy;
    int         maxshield;
    int         maxhull;
    short      maxchaff;
};

#define NEWBIE_SHIP_PROTOTYPE "NU-b13 Starfighter"

struct turret_data
{
    TURRET_DATA * next;
    TURRET_DATA * prev;
    ROOM_INDEX_DATA *room;
    SHIP_DATA  *target;
    short      laserstate;
};

struct hangar_data
{
    HANGAR_DATA * next;
    HANGAR_DATA * prev;
    ROOM_INDEX_DATA *room;
    bool        vehicle;
    bool        bayopen;
};

struct ship_data
{
  SHIP_DATA * next;
  SHIP_DATA * prev;
  SHIP_DATA * next_in_starsystem;
  SHIP_DATA * prev_in_starsystem;
  SHIP_DATA * next_in_room;
  SHIP_DATA * prev_in_room;
  ROOM_INDEX_DATA *in_room;
  ROOM_INDEX_DATA *first_room;
  ROOM_INDEX_DATA *last_room;
  ROOM_INDEX_DATA *pilotseat;
  ROOM_INDEX_DATA *gunseat;
  ROOM_INDEX_DATA *viewscreen;
  ROOM_INDEX_DATA *engine;
  ROOM_INDEX_DATA *entrance;
  SPACE_DATA * starsystem;
  TURRET_DATA *first_turret;
  TURRET_DATA *last_turret;
  HANGAR_DATA *first_hangar;
  HANGAR_DATA *last_hangar;
  char *      filename;
  char *      name;
  char *      home;
  char *      description[MAX_SHIP_ROOMS];
  char *      owner;
  char *      pilot;
  char *      copilot;
  char *      dest;
  short      type;
  short      ship_class;
  short      model;
  short      hyperspeed;
  int         hyperdistance;
  short      realspeed;
  short	currspeed;
  short      shipstate;
  short      laserstate;
  short      missilestate;
  short      missiles;
  short      maxmissiles;
  short      lasers;
  short      tractorbeam;
  short      manuever;
  bool        hatchopen;
  bool 	autorecharge;
  bool        autotrack;
  bool 	autospeed;
  Vector3 pos;
  Vector3 head;
  Vector3 jump;
  int         maxenergy;
  int         energy;
  int         shield;
  int         maxshield;
  int         hull;
  int         maxhull;
  int         location;
  int         lastdoc;
  int         shipyard;
  long        collision;
  SHIP_DATA  *target;
  SPACE_DATA *currjump;
  short      chaff;
  short      maxchaff;
  bool        chaff_released;
  bool        autopilot;
};

struct missile_data
{
  MISSILE_DATA * next;
  MISSILE_DATA * prev;
  MISSILE_DATA * next_in_starsystem;
  MISSILE_DATA * prev_in_starsystem;
  SPACE_DATA * starsystem;
  SHIP_DATA * target;
  SHIP_DATA * fired_from;
  char      * fired_by;
  short      age;
  int         speed;
  Vector3 pos;
  Vector3 head;
};


/*
 * Data structure for notes.
 */
struct	note_data
{
    NOTE_DATA *	next;
    NOTE_DATA * prev;
    char *	sender;
    char *	date;
    char *	to_list;
    char *	subject;
    int         voting;
    char *	yesvotes;
    char *	novotes;
    char *	abstentions;
    char *	text;
};

struct	board_data
{
    BOARD_DATA * next;			/* Next board in list		   */
    BOARD_DATA * prev;			/* Previous board in list	   */
    NOTE_DATA *  first_note;		/* First note on board		   */
    NOTE_DATA *  last_note;		/* Last note on board		   */
    char *	 note_file;		/* Filename to save notes to	   */
    char *	 read_group;		/* Can restrict a board to a       */
    char *	 post_group;		/* council, clan, guild etc        */
    char *	 extra_readers;		/* Can give read rights to players */
    char *       extra_removers;        /* Can give remove rights to players */
    int		 board_obj;		/* Vnum of board object		   */
    short	 num_posts;		/* Number of notes on this board   */
    short	 min_read_level;	/* Minimum level to read a note	   */
    short	 min_post_level;	/* Minimum level to post a note    */
    short	 min_remove_level;	/* Minimum level to remove a note  */
    short	 max_posts;		/* Maximum amount of notes allowed */
    int          type;                  /* Normal board or mail board? */
};


/*
 * An affect.
 */
struct	affect_data
{
    AFFECT_DATA *	next;
    AFFECT_DATA *	prev;
    short		type;
    short		duration;
    short		location;
    int			modifier;
    int			bitvector;
};


/*
 * A SMAUG spell
 */
struct	smaug_affect
{
    SMAUG_AFF *		next;
    char *		duration;
    short		location;
    char *		modifier;
    int			bitvector;
};


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

/*
 * Well known mob virtual numbers.
 * Defined in #MOBILES.
 */
#define MOB_VNUM_SUPERMOB               2
#define MOB_VNUM_SOLDIER		3
#define MOB_VNUM_GUARD			4
#define MOB_VNUM_PATROL			5
#define MOB_VNUM_TRADER			6
#define MOB_VNUM_SPACEPORT_GUARD	7
#define MOB_VNUM_BIRD			8
#define MOB_VNUM_SCAVENGER		9
#define MOB_VNUM_INSECT			10
#define MOB_VNUM_PREDITOR		11
#define MOB_VNUM_SMALL_ANIMAL		12
#define MOB_VNUM_FISH			13
#define MOB_VNUM_CITIZEN		14
#define MOB_VNUM_SUPPLIER 		15
#define MOB_VNUM_WAITER 		16
#define MOB_VNUM_CONTROLLER		17
#define MOB_VNUM_BARTENDER		18
#define MOB_VNUM_MECHANIC		19
#define MOB_VNUM_PAWNER			20
#define MOB_VNUM_TECHNICIAN		21
#define MOB_VNUM_DEALER			22
#define MOB_VNUM_VENDOR			23
#define MOB_VNUM_DRAGON			24
#define MOB_VNUM_THIEF			25
#define MOB_VNUM_THUG			26
#define MOB_VNUM_BUM			27
#define MOB_VNUM_SHIP_GUARD		28
#define MOB_VNUM_ALIEN			29
#define MOB_VNUM_JOB_OFFICER		30

/*
 * ACT bits for mobs.
 * Used in #MOBILES.
 */
#define ACT_IS_NPC		 BV00		/* Auto set for mobs	*/
#define ACT_SENTINEL		 BV01		/* Stays in one room	*/
#define ACT_SCAVENGER		 BV02		/* Picks up objects	*/
#define ACT_AGGRESSIVE		 BV05		/* Attacks PC's		*/
#define ACT_STAY_AREA		 BV06		/* Won't leave area	*/
#define ACT_WIMPY		 BV07		/* Flees when hurt	*/
#define ACT_PET			 BV08		/* Auto set for pets	*/
#define ACT_TRAIN		 BV09		/* Can train PC's	*/
#define ACT_PRACTICE		 BV10		/* Can practice PC's	*/
#define ACT_IMMORTAL		 BV11		/* Cannot be killed	*/
#define ACT_DEADLY		 BV12		/* Has a deadly poison  */
#define ACT_POLYSELF		 BV13
#define ACT_META_AGGR		 BV14		/* Extremely aggressive */
#define ACT_GUARDIAN		 BV15		/* Protects master	*/
#define ACT_RUNNING		 BV16		/* Hunts quickly	*/
#define ACT_NOWANDER		 BV17		/* Doesn't wander	*/
#define ACT_MOUNTABLE		 BV18		/* Can be mounted	*/
#define ACT_MOUNTED		 BV19		/* Is mounted		*/
#define ACT_CITIZEN              BV20           /* affects planet population as opposed to wildlife */
#define ACT_SECRETIVE		 BV21		/* actions aren't seen	*/
#define ACT_POLYMORPHED		 BV22		/* Mob is a ch		*/
#define ACT_MOBINVIS		 BV23		/* Like wizinvis	*/
#define ACT_NOASSIST		 BV24		/* Doesn't assist mobs	*/
#define ACT_NOKILL               BV25           /* Mob can't die */
#define ACT_DROID                BV26           /* mob is a droid */
#define ACT_NOCORPSE             BV27           
#define ACT_PROTOTYPE		 BV30		/* A prototype mob	*/

/*
 * Bits for 'affected_by'.
 * Used in #MOBILES.
 */
#define AFF_NONE                  0 
 
#define AFF_BLIND		  BV00
#define AFF_INVISIBLE		  BV01
#define AFF_DETECT_EVIL		  BV02
#define AFF_DETECT_INVIS	  BV03
#define AFF_DETECT_MAGIC	  BV04
#define AFF_DETECT_HIDDEN	  BV05
#define AFF_WEAKEN		  BV06		
#define AFF_SANCTUARY		  BV07
#define AFF_FAERIE_FIRE		  BV08
#define AFF_INFRARED		  BV09
#define AFF_CURSE		  BV10
#define AFF_FLAMING		  BV11		/* Unused	*/
#define AFF_POISON		  BV12
#define AFF_PROTECT		  BV13
#define AFF_PARALYSIS		  BV14
#define AFF_SNEAK		  BV15
#define AFF_HIDE		  BV16
#define AFF_SLEEP		  BV17
#define AFF_CHARM		  BV18
#define AFF_FLYING		  BV19
#define AFF_PASS_DOOR		  BV20
#define AFF_FLOATING		  BV21
#define AFF_TRUESIGHT		  BV22
#define AFF_DETECTTRAPS		  BV23
#define AFF_SCRYING	          BV24
#define AFF_FIRESHIELD	          BV25
#define AFF_SHOCKSHIELD	          BV26
#define AFF_HAUS1                 BV27        /* not used */
#define AFF_ICESHIELD  		  BV28
#define AFF_POSSESS		  BV29
#define AFF_BERSERK		  BV30
#define AFF_AQUA_BREATH		  BV31

/* 31 aff's (1 left.. :P) */
/* make that none - ugh - time for another field? :P */
/*
 * Resistant Immune Susceptible flags
 */
#define RIS_FIRE		  BV00
#define RIS_COLD		  BV01
#define RIS_ELECTRICITY		  BV02
#define RIS_ENERGY		  BV03
#define RIS_BLUNT		  BV04
#define RIS_PIERCE		  BV05
#define RIS_SLASH		  BV06
#define RIS_ACID		  BV07
#define RIS_POISON		  BV08
#define RIS_DRAIN		  BV09
#define RIS_SLEEP		  BV10
#define RIS_CHARM		  BV11
#define RIS_HOLD		  BV12
#define RIS_NONMAGIC		  BV13
#define RIS_PLUS1		  BV14
#define RIS_PLUS2		  BV15
#define RIS_PLUS3		  BV16
#define RIS_PLUS4		  BV17
#define RIS_PLUS5		  BV18
#define RIS_PLUS6		  BV19
#define RIS_MAGIC		  BV20
#define RIS_PARALYSIS		  BV21
/* 21 RIS's*/

/* 
 * Attack types
 */
#define ATCK_BITE		  BV00
#define ATCK_CLAWS		  BV01
#define ATCK_TAIL		  BV02
#define ATCK_STING		  BV03
#define ATCK_PUNCH		  BV04
#define ATCK_KICK		  BV05
#define ATCK_TRIP		  BV06
#define ATCK_BASH		  BV07
#define ATCK_STUN		  BV08
#define ATCK_GOUGE		  BV09
#define ATCK_BACKSTAB		  BV10
#define ATCK_FEED		  BV11
#define ATCK_DRAIN		  BV12
#define ATCK_FIREBREATH		  BV13
#define ATCK_FROSTBREATH	  BV14
#define ATCK_ACIDBREATH		  BV15
#define ATCK_LIGHTNBREATH	  BV16
#define ATCK_GASBREATH		  BV17
#define ATCK_POISON		  BV18
#define ATCK_NASTYPOISON	  BV19
#define ATCK_GAZE		  BV20
#define ATCK_BLINDNESS		  BV21
#define ATCK_CAUSESERIOUS	  BV22
#define ATCK_EARTHQUAKE		  BV23
#define ATCK_CAUSECRITICAL	  BV24
#define ATCK_CURSE		  BV25
#define ATCK_FLAMESTRIKE	  BV26
#define ATCK_HARM		  BV27
#define ATCK_FIREBALL		  BV28
#define ATCK_COLORSPRAY		  BV29
#define ATCK_WEAKEN		  BV30
#define ATCK_SPIRALBLAST	  BV31
/* 32 USED! DO NOT ADD MORE! SB */

/*
 * Defense types
 */
#define DFND_PARRY		  BV00
#define DFND_DODGE		  BV01
#define DFND_HEAL		  BV02
#define DFND_CURELIGHT		  BV03
#define DFND_CURESERIOUS	  BV04
#define DFND_CURECRITICAL	  BV05
#define DFND_DISPELMAGIC	  BV06
#define DFND_DISPELEVIL		  BV07
#define DFND_SANCTUARY		  BV08
#define DFND_FIRESHIELD		  BV09
#define DFND_SHOCKSHIELD	  BV10
#define DFND_SHIELD		  BV11
#define DFND_BLESS		  BV12
#define DFND_STONESKIN		  BV13
#define DFND_TELEPORT		  BV14
#define DFND_MONSUM1		  BV15
#define DFND_MONSUM2		  BV16
#define DFND_MONSUM3		  BV17
#define DFND_MONSUM4		  BV18
#define DFND_DISARM		  BV19
#define DFND_ICESHIELD 		  BV20
#define DFND_GRIP		  BV21
/* 21 def's */

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

/*
 * Skill/Spell flags	The minimum BV *MUST* be 11!
 */
#define SF_WATER		  BV11
#define SF_EARTH		  BV12
#define SF_AIR			  BV13
#define SF_ASTRAL		  BV14
#define SF_AREA			  BV15  /* is an area spell		*/
#define SF_DISTANT		  BV16  /* affects something far away	*/
#define SF_REVERSE		  BV17
#define SF_SAVE_HALF_DAMAGE	  BV18  /* save for half damage		*/
#define SF_SAVE_NEGATES		  BV19  /* save negates affect		*/
#define SF_ACCUMULATIVE		  BV20  /* is accumulative		*/
#define SF_RECASTABLE		  BV21  /* can be refreshed		*/
#define SF_NOSCRIBE		  BV22  /* cannot be scribed		*/
#define SF_NOBREW		  BV23  /* cannot be brewed		*/
#define SF_GROUPSPELL		  BV24  /* only affects group members	*/
#define SF_OBJECT		  BV25	/* directed at an object	*/
#define SF_CHARACTER		  BV26  /* directed at a character	*/
#define SF_SECRETSKILL		  BV27	/* hidden unless learned	*/
#define SF_PKSENSITIVE		  BV28	/* much harder for plr vs. plr	*/
#define SF_STOPONFAIL		  BV29	/* stops spell on first failure */

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

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

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

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

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

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

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

/*
 * Well known object virtual numbers.
 * Defined in #OBJECTS.
 */
#define OBJ_VNUM_MONEY_ONE	     1
#define OBJ_VNUM_MONEY_SOME	     2
#define OBJ_VNUM_DROID_CORPSE        3
#define OBJ_VNUM_CORPSE_NPC	     4
#define OBJ_VNUM_CORPSE_PC	     5
#define OBJ_VNUM_SCRAPS		     6
#define OBJ_VNUM_MUSHROOM	     7
#define OBJ_VNUM_LIGHT		     8
#define OBJ_VNUM_SPRING		     9
#define OBJ_VNUM_SLICE		     10
#define OBJ_VNUM_SHOPPING_BAG	     11
#define OBJ_VNUM_PROTO_LIGHTSABER    12
#define OBJ_VNUM_MESSAGE_TERMINAL    13
#define OBJ_VNUM_BLACK_POWDER	     14
#define OBJ_VNUM_NOTE		     15
#define OBJ_VNUM_MAIL_TERMINAL       16
#define OBJ_VNUM_SCHOOL_DAGGER	     18
#define OBJ_VNUM_BLASTER             17
#define OBJ_VNUM_CANTEEN             19
#define OBJ_VNUM_BACKPACK            20
#define OBJ_VNUM_PROTO_BLASTER	     21
#define OBJ_VNUM_PROTO_BLADE	     22
#define OBJ_VNUM_COMLINK             23
#define OBJ_VNUM_PROTO_ARMOR	     24
#define OBJ_VNUM_IMM_TERMINAL	     25
#define OBJ_VNUM_PROTO_SHIELD	     26
#define OBJ_VNUM_DRIED_FRUIT	     27
#define OBJ_VNUM_AMMO                28
#define OBJ_VNUM_FIRST_PART	     29  /* first randomly placed object */
#define OBJ_VNUM_LAST_PART	     38  /* last randomly placed object */

#define OBJ_VNUM_FRUIT		     51
#define OBJ_VNUM_ROOT		     52
#define OBJ_VNUM_SEAWEED	     53
#define OBJ_VNUM_PLANT		     54
#define OBJ_VNUM_HEMP		     55
#define OBJ_VNUM_RESIN		     56
#define OBJ_VNUM_CRYSTAL	     57
#define OBJ_VNUM_METAL		     58
#define OBJ_VNUM_GOLD		     59
#define OBJ_VNUM_SHOVEL		     60
#define OBJ_VNUM_BATTERY             61
#define OBJ_VNUM_APPETIZER           62
#define OBJ_VNUM_SALAD               63
#define OBJ_VNUM_LUNCH               64
#define OBJ_VNUM_DINNER              65
#define OBJ_VNUM_GLASSOFWATER        66
#define OBJ_VNUM_COFFEE              67
#define OBJ_VNUM_JUICE               68
#define OBJ_VNUM_BEER                69
#define OBJ_VNUM_WHISKEY             70
#define OBJ_VNUM_DRAGON_CRYSTAL      71
#define OBJ_VNUM_DRAGON_NEST         72
#define OBJ_VNUM_SEWKIT              73

#define OBJ_VNUM_FIRST_FABRIC        75  
#define OBJ_VNUM_LAST_FABRIC         99

#define OBJ_VNUM_PACKAGE             100

/*
 * Item types.
 * Used in #OBJECTS.
 */
typedef enum
{
  ITEM_NONE, ITEM_LIGHT, ITEM_WEAPON, ITEM_ARMOR, ITEM_FURNITURE, 
  ITEM_TRASH, ITEM_CONTAINER, ITEM_PAPER, ITEM_DRINK_CON, ITEM_FOOD, 
  ITEM_MONEY, ITEM_PEN, ITEM_CORPSE_NPC, ITEM_CORPSE_PC, ITEM_FOUNTAIN, 
  ITEM_SCRAPS, ITEM_LOCKPICK, ITEM_AMMO, ITEM_SHOVEL, ITEM_LENS, 
  ITEM_CRYSTAL, ITEM_PLASTIC, ITEM_BATTERY, ITEM_TOOLKIT, ITEM_METAL, 
  ITEM_OVEN, ITEM_MIRROR, ITEM_CIRCUIT, ITEM_SUPERCONDUCTOR, ITEM_COMLINK, 
  ITEM_MEDPAC, ITEM_FABRIC, ITEM_RARE_METAL, ITEM_MAGNET, ITEM_THREAD, 
  ITEM_DEVICE, ITEM_DROID_CORPSE, ITEM_RESOURCE
} item_types;


#define MAX_ITEM_TYPE		     ITEM_RESOURCE
/*
 * Extra flags.
 * Used in #OBJECTS.
 */
#define ITEM_GLOW		BV00
#define ITEM_HUM		BV01
#define ITEM_DARK		BV02
#define ITEM_BV4		BV04
#define ITEM_INVIS		BV05
#define ITEM_MAGIC		BV06
#define ITEM_NODROP		BV07
#define ITEM_BLESS		BV08
#define ITEM_BV9		BV09
#define ITEM_BV10		BV10
#define ITEM_BV11		BV11
#define ITEM_NOREMOVE		BV12
#define ITEM_INVENTORY		BV13
#define ITEM_BV14		BV14
#define ITEM_BV15	        BV15
#define ITEM_BV16		BV16
#define ITEM_BV17   		BV17
#define ITEM_DONATION		BV20
#define ITEM_CLANOBJECT		BV21
#define ITEM_BV22		BV22
#define ITEM_BV23 	  	BV23
#define ITEM_BV24   	        BV24
#define ITEM_HIDDEN		BV25
#define ITEM_POISONED		BV26
#define ITEM_COVERING		BV27
#define ITEM_DEATHROT		BV28
#define ITEM_BURRIED		BV29	/* item is underground */
#define ITEM_PROTOTYPE		BV30

/* Magic flags - extra extra_flags for objects that are used in spells */
#define ITEM_RETURNING		BV00
#define ITEM_BACKSTABBER  	BV01
#define ITEM_BANE		BV02
#define ITEM_LOYAL		BV03
#define ITEM_HASTE		BV04
#define ITEM_DRAIN		BV05
#define ITEM_LIGHTNING_BLADE  	BV06

/* Blaster settings - only saves on characters */
#define BLASTER_NORMAL          0
#define BLASTER_HALF		2
#define BLASTER_FULL            5
#define BLASTER_LOW		1	
#define	BLASTER_STUN		3
#define BLASTER_HIGH            4

/* Weapon Types */

#define WEAPON_NONE     	0
#define WEAPON_VIBRO_BLADE	2
#define WEAPON_LIGHTSABER	3
#define WEAPON_BLASTER		6

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

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


/*
 * Apply types (for affects).
 * Used in #OBJECTS.
 */
typedef enum
{
  APPLY_NONE, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_WIS, APPLY_CON,
  APPLY_SEX, APPLY_NULL , APPLY_LEVEL, APPLY_AGE, APPLY_HEIGHT, APPLY_WEIGHT,
  APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_GOLD, APPLY_EXP, APPLY_AC,
  APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_POISON, APPLY_SAVING_ROD,
  APPLY_SAVING_PARA, APPLY_SAVING_BREATH, APPLY_SAVING_SPELL, APPLY_CHA,
  APPLY_AFFECT, APPLY_RESISTANT, APPLY_IMMUNE, APPLY_SUSCEPTIBLE,
  APPLY_WEAPONSPELL, APPLY_LCK, APPLY_BACKSTAB, APPLY_PICK, APPLY_TRACK,
  APPLY_STEAL, APPLY_SNEAK, APPLY_HIDE, APPLY_PALM, APPLY_DETRAP, APPLY_DODGE,
  APPLY_PEEK, APPLY_SCAN, APPLY_GOUGE, APPLY_SEARCH, APPLY_MOUNT, APPLY_DISARM,
  APPLY_KICK, APPLY_PARRY, APPLY_BASH, APPLY_STUN, APPLY_PUNCH, APPLY_CLIMB,
  APPLY_GRIP, APPLY_SCRIBE, APPLY_BREW, APPLY_WEARSPELL, APPLY_REMOVESPELL,
  APPLY_EMOTION, APPLY_MENTALSTATE, APPLY_STRIPSN, APPLY_REMOVE, APPLY_DIG,
  APPLY_FULL, APPLY_THIRST, APPLY_DRUNK, APPLY_BLOOD, MAX_APPLY_TYPE
} apply_types;

#define REVERSE_APPLY		   1000

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

/*
 * Well known room virtual numbers.
 * Defined in #ROOMS.
 */
#define ROOM_VNUM_SUPERMOB_OFFICE     1
#define ROOM_VNUM_LIMBO		      2
#define ROOM_LIMBO_SHIPYARD           3
#define ROOM_IMMORTAL_START           4
#define ROOM_VNUM_SCHOOL              10
#define ROOM_NEWBIE_SHIPYARD	      5
#define ROOM_VNUM_JAIL		      19

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

#define ROOM_DARK       BV00
/* BV01 now reserved for track  BV01  and hunt */
#define ROOM_NO_MOB     BV02
#define ROOM_INDOORS    BV03
#define ROOM_CAN_LAND   BV04
#define ROOM_GARAGE     BV05
#define ROOM_CONTROL    BV06  
#define ROOM_TRADE      BV07
#define ROOM_BANK       BV08
#define ROOM_MEDICAL    BV09
#define ROOM_SAFE       BV10
#define ROOM_MAIL       BV11
#define ROOM_INFO       BV12
#define R13             BV13
#define ROOM_SHIPYARD   BV14
#define ROOM_BARRACKS   BV15
#define R16             BV16
#define ROOM_NOPEDIT    BV17 /* players can't edit */
#define R18             BV18
#define ROOM_RESTAURANT	BV19
#define ROOM_PLR_HOME   BV20
#define ROOM_EMPTY_HOME BV21
#define R22             BV22
#define ROOM_HOTEL      BV23
#define ROOM_NOFLOOR    BV24
#define ROOM_PAWN       BV25
#define ROOM_SUPPLY     BV26
#define ROOM_BAR        BV27
#define ROOM_EMPLOYMENT BV28
#define ROOM_SPACECRAFT BV29
#define R30             BV30
#define ROOM_AUCTION    BV31

/*
 * Colony room types
 */

typedef enum
  {
    COLONY_ROOM_FIRST = 1,
    COLONY_ROOM_WILDERNESS,
    COLONY_ROOM_FARMLAND,
    COLONY_ROOM_CITY_STREET,
    COLONY_ROOM_SHIPYARD,
    COLONY_ROOM_HOUSE,
    COLONY_ROOM_CAVE,
    COLONY_ROOM_INFO,
    COLONY_ROOM_MAIL,
    COLONY_ROOM_TRADE,
    COLONY_ROOM_PAWN,
    COLONY_ROOM_SUPPLY_SHOP,
    COLONY_ROOM_COLONIZATION_CENTER,
    COLONY_ROOM_SHUTTLE_PLATFORM,
    COLONY_ROOM_RESTAURANT,
    COLONY_ROOM_BAR,
    COLONY_ROOM_CONTROL,
    COLONY_ROOM_HOTEL,
    COLONY_ROOM_BARRACKS,
    COLONY_ROOM_GARAGE,
    COLONY_ROOM_BANK,
    COLONY_ROOM_EMPLOYMENT,
    COLONY_ROOM_MEDICAL,
    COLONY_ROOM_UNUSED24,
    COLONY_ROOM_LAST
  } colony_room_types;

static const int COLONY_COST = 100000;

/*
 * Directions.
 * Used in #ROOMS.
 */
typedef enum
{
  DIR_NORTH,     /*  0 */
  DIR_EAST,      /*  1 */
  DIR_SOUTH,     /*  2 */
  DIR_WEST,      /*  3 */
  DIR_UP,        /*  4 */
  DIR_DOWN,      /*  5 */
  DIR_NORTHEAST, /*  6 */
  DIR_NORTHWEST, /*  7 */
  DIR_SOUTHEAST, /*  8 */
  DIR_SOUTHWEST, /*  9 */
  DIR_SOMEWHERE  /* 10 */
} dir_types;

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

/*
 * Exit flags.
 * Used in #ROOMS.
 */
#define EX_ISDOOR		  BV00
#define EX_CLOSED		  BV01
#define EX_LOCKED		  BV02
#define EX_SECRET		  BV03
#define EX_SWIM			  BV04
#define EX_PICKPROOF		  BV05
#define EX_FLY			  BV06
#define EX_CLIMB		  BV07
#define EX_DIG			  BV08
#define EX_RES1                   BV09	/* are these res[1-4] important? */
#define EX_NOPASSDOOR		  BV10
#define EX_HIDDEN		  BV11
#define EX_PASSAGE		  BV12
#define EX_PORTAL 		  BV13
#define EX_RES2			  BV14
#define EX_RES3			  BV15
#define EX_xCLIMB		  BV16
#define EX_xENTER		  BV17
#define EX_xLEAVE		  BV18
#define EX_xAUTO		  BV19
#define EX_RES4	  		  BV20
#define EX_xSEARCHABLE		  BV21
#define EX_BASHED                 BV22
#define EX_BASHPROOF              BV23
#define EX_NOMOB		  BV24
#define EX_WINDOW		  BV25
#define EX_xLOOK		  BV26
#define MAX_EXFLAG		  26

/*
 * Sector types.
 * Used in #ROOMS.
 */
typedef enum
{
  SECT_INSIDE, SECT_CITY, SECT_FIELD, SECT_FOREST, SECT_HILLS, SECT_MOUNTAIN,
  SECT_WATER_SWIM, SECT_WATER_NOSWIM, SECT_UNDERWATER, SECT_AIR, SECT_DESERT,
  SECT_DUNNO, SECT_OCEANFLOOR, SECT_UNDERGROUND, SECT_SCRUB, SECT_ROCKY,
  SECT_SAVANNA, SECT_TUNDRA, SECT_GLACIAL, SECT_RAINFOREST, SECT_JUNGLE, 
  SECT_SWAMP, SECT_WETLANDS, SECT_BRUSH, SECT_STEPPE, SECT_FARMLAND, SECT_VOLCANIC,
  SECT_MAX
} sector_types;

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

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

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

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

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

/*
 * ACT bits for players.
 */
#define PLR_IS_NPC     BV00	/* Don't EVER set.	*/
#define PLR_BOUGHT_PET BV01
#define PLR_SHOVEDRAG  BV02
#define PLR_AUTOEXIT   BV03
#define PLR_AUTOLOOT   BV04
#define PLR_AUTOSAC    BV05
#define PLR_BLANK      BV06
#define PLR_OUTCAST    BV07
#define PLR_BRIEF      BV08
#define PLR_COMBINE    BV09
#define PLR_PROMPT     BV10
#define PLR_TELNET_GA  BV11

#define PLR_HOLYLIGHT  BV12
#define PLR_WIZINVIS   BV13
#define PLR_ROOMVNUM   BV14

#define	PLR_SILENCE    BV15
#define PLR_NO_EMOTE   BV16
#define PLR_ATTACKER   BV17
#define PLR_NO_TELL    BV18
#define PLR_LOG        BV19
#define PLR_DENY       BV20
#define PLR_FREEZE     BV21
#define PLR_KILLER     BV22
/*
#define PLR_    	           BV23
*/
#define PLR_LITTERBUG  BV24
#define PLR_ANSI       BV25
#define PLR_SOUND      BV26
#define PLR_NICE       BV27
#define PLR_FLEE       BV28
#define PLR_AUTOGOLD   BV29
#define PLR_AUTOMAP    BV30
#define PLR_AFK        BV31

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

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

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


/*
 * Channel bits.
 */
#define	CHANNEL_AUCTION		   BV00
#define	CHANNEL_IMMTALK		   BV01
#define	CHANNEL_YELL		   BV02
#define CHANNEL_MONITOR		   BV03
#define CHANNEL_LOG		   BV04
#define CHANNEL_CLAN		   BV05
#define CHANNEL_BUILD		   BV06
#define CHANNEL_COMM		   BV07
#define CHANNEL_TELLS		   BV08
#define CHANNEL_NEWBIE             BV09
#define CHANNEL_OOC                BV10
#define CHANNEL_SHIP               BV11
#define CHANNEL_SYSTEM             BV12
#define CHANNEL_GNET               BV13
#define CHANNEL_PNET               BV14

#define CHANNEL_CLANTALK	   CHANNEL_CLAN

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

/* Area flags - Narn Mar/96 */
#define AFLAG_NOPKILL               BV00
#define AFLAG_MODIFIED              BV01  /* signifies area needs saving */

/*
 * Prototype for a mob.
 * This is the in-memory version of #MOBILES.
 */
struct	mob_index_data
{
    MOB_INDEX_DATA *	next;
    SPEC_FUN *		spec_fun;
    SPEC_FUN *          spec_2;
    SHOP_DATA *		pShop;
    REPAIR_DATA *	rShop;
    MPROG_DATA *	mudprogs;
    int			progtypes;
    char *		player_name;
    char *		short_descr;
    char *		long_descr;
    char *		description;
    long 		vnum;
    short		count;
    short		killed;
    short		sex;
    short		level;
    int			act;
    int			affected_by;
    short		alignment;
    short		ac;
    short		hitnodice;
    short		hitsizedice;
    short		hitplus;
    short		damnodice;
    short		damsizedice;
    short		damplus;
    short		numattacks;
    int			gold;
    int			resistant;
    int			immune;
    int			susceptible;
    int			attacks;
    int			defenses;
    short		position;
    short		defposition;
    short		height;
    short		weight;
    short		hitroll;
    short		damroll;
    short		perm_str;
    short		perm_int;
    short		perm_wis;
    short		perm_dex;
    short		perm_con;
    short		perm_cha;
    short		perm_lck;
    short		perm_frc;
    short		saving_poison_death;
    short		saving_wand;
    short		saving_para_petri;
    short		saving_breath;
    short		saving_spell_staff;
};


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

struct fighting_data
{
    CHAR_DATA *		who;
    int			xp;
    short		align;
    short		duration;
    short		timeskilled;
};

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

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

/*
 * One character (PC or NPC).
 * (Shouldn't most of that build interface stuff use substate, dest_buf,
 * spare_ptr and tempnum?  Seems a little redundant)
 */
struct	char_data
{
    CHAR_DATA *		next;
    CHAR_DATA *		prev;
    CHAR_DATA *		next_in_room;
    CHAR_DATA *		prev_in_room;
    CHAR_DATA *		master;
    CHAR_DATA *		leader;
    FIGHT_DATA *	fighting;
    CHAR_DATA *		reply;
    CHAR_DATA *		switched;
    CHAR_DATA *		mount;
    HHF_DATA *		hunting;
    HHF_DATA *		fearing;
    HHF_DATA *		hating;
    SPEC_FUN *		spec_fun;
    SPEC_FUN *		spec_2;
    MPROG_ACT_LIST *	mpact;
    int			mpactnum;
  size_t		mpscriptpos;
    MOB_INDEX_DATA *	pIndexData;
    DESCRIPTOR_DATA *	desc;
    AFFECT_DATA *	first_affect;
    AFFECT_DATA *	last_affect;
    NOTE_DATA *		pnote;
    OBJ_DATA *		first_carrying;
    OBJ_DATA *		last_carrying;
    ROOM_INDEX_DATA *	in_room;
    ROOM_INDEX_DATA *	was_in_room;
    ROOM_INDEX_DATA *   was_sentinel;
    ROOM_INDEX_DATA *   plr_home;
    PC_DATA *		pcdata;
    DO_FUN *		last_cmd;
    void *		dest_buf;
    void *		dest_buf_2;
    void *		spare_ptr;
    long			tempnum;
    EDITOR_DATA *	editor;
    TIMER	*	first_timer;
    TIMER	*	last_timer;
    char *		name;
    char *		short_descr;
    char *		long_descr;
    char *		description;
    short		num_fighting;
    short		substate;
    short		sex;
    short              top_level;
    short		trust;
    int			played;
    time_t		logon;
    time_t		save_time;
    short		timer;
    short		wait;
    short		hit;
    short		max_hit;
    short		mana;
    short		max_mana;
    short		move;
    short		max_move;
    short		numattacks;
    int			gold;
    int 		act;
    int			affected_by;
    int			carry_weight;
    int			carry_number;
    int			resistant;
    int			immune;
    int			susceptible;
    int			attacks;
    int			defenses;
    short		saving_poison_death;
    short		saving_wand;
    short		saving_para_petri;
    short		saving_breath;
    short		saving_spell_staff;
    short		alignment;
    short		barenumdie;
    short		baresizedie;
    short		hitroll;
    short		damroll;
    short		hitplus;
    short		damplus;
    short		position;
    short		defposition;
    short		height;
    short		weight;
    short		armor;
    short		wimpy;
    int			deaf;
    short		perm_str;
    short		perm_int;
    short		perm_wis;
    short		perm_dex;
    short		perm_con;
    short		perm_cha;
    short		perm_lck;
    short		perm_frc;
    short		mod_str;
    short		mod_int;
    short		mod_wis;
    short		mod_dex;
    short		mod_con;
    short		mod_cha;
    short		mod_lck;
    short		mod_frc;
    short		mental_state;		/* simplified */
    short		emotional_state;	/* simplified */
    int			retran;
    int			regoto;
    short		mobinvis;	/* Mobinvis level SB */
    short              backup_wait;	/* reinforcements */
    long                backup_mob;     /* reinforcements */
    short              was_stunned;
    CLAN_DATA       *   mob_clan;    /* for spec_clan_guard.. set by postguard */
    GUARD_DATA      *   guard_data;
};


struct killed_data
{
    long		vnum;
    char		count;
};

#ifdef SWR2_USE_IMC
#include "imc.h"
#endif

/*
 * Data which only PC's have.
 */
struct	pc_data
{
  CLAN_DATA *clan;
  AREA_DATA *area;
  char *homepage;
  char *clan_permissions;
  char *pwd;
  char *email;
  char *bamfin;
  char *bamfout;
  char *rank;
  char *title;
  char *bestowments;	/* Special bestowed commands	   */
  int flags;		/* Whether the player is deadly and whatever else we add. */
  int pkills;		/* Number of pkills on behalf of clan */
  int pdeaths;	/* Number of times pkilled (legally)  */
  time_t outcast_time;	/* The time at which the char was outcast */
  time_t restore_time;	/* The last time the char did a restore all */
  short wizinvis;	/* wizinvis level */
  short	min_snoop;	/* minimum snoop level */
  short	condition[MAX_CONDS];
  short	learned[MAX_SKILL];
  KILLED_DATA killed[MAX_KILLTRACK];
  int auth_state;
  time_t release_date;	/* Auto-helling.. Altrag */
  char *helled_by;
  char *bio;		/* Personal Bio */
  char *authed_by;	/* what crazy imm authed this name ;) */
  char *prompt;		/* User config prompts */
  char *subprompt;	/* Substate prompt */
  short pagerlen;	/* For pager (NOT menus) */
  long bank;
  short num_skills;
  short adept_skills;
#ifdef SWR2_USE_IMC
  IMC_CHARDATA *imcchardata;
#endif
};



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

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



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



/*
 * Prototype for an object.
 */
struct	obj_index_data
{
    OBJ_INDEX_DATA *	next;
    EXTRA_DESCR_DATA *	first_extradesc;
    EXTRA_DESCR_DATA *	last_extradesc;
    AFFECT_DATA *	first_affect;
    AFFECT_DATA *	last_affect;
    MPROG_DATA *	mudprogs;               /* objprogs */
    int			progtypes;              /* objprogs */
    char *		name;
    char *		short_descr;
    char *		description;
    char *		action_desc;
    long		vnum;
    short		item_type;
    int			extra_flags;
    int			magic_flags; /*Need more bitvectors for spells - Scryn*/
    int			wear_flags;
    short		count;
    short		weight;
    int			cost;
    int			value	[6];
    int			serial;
    short		layers;
};

/*
 * One object.
 */
struct	obj_data
{
    OBJ_DATA *		next;
    OBJ_DATA *		prev;
    OBJ_DATA *		next_content;
    OBJ_DATA *		prev_content;
    OBJ_DATA *		first_content;
    OBJ_DATA *		last_content;
    OBJ_DATA *		in_obj;
    CHAR_DATA *		carried_by;
    EXTRA_DESCR_DATA *	first_extradesc;
    EXTRA_DESCR_DATA *	last_extradesc;
    AFFECT_DATA *	first_affect;
    AFFECT_DATA *	last_affect;
    OBJ_INDEX_DATA *	pIndexData;
    ROOM_INDEX_DATA *	in_room;
    char *		name;
    char *		short_descr;
    char *		description;
    char *		action_desc;
    short		item_type;
  size_t		mpscriptpos;
    int			extra_flags;
    int			magic_flags; /*Need more bitvectors for spells - Scryn*/
    int			wear_flags; 
    int                 blaster_setting;
    MPROG_ACT_LIST *	mpact;		/* mudprogs */
    int			mpactnum;	/* mudprogs */
    short		wear_loc;
    short		weight;
    int			cost;
    short		timer;
    int			value	[6];
    short		count;		/* support for object grouping */
    int			serial;		/* serial number	       */
};


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



/*
 * Area definition.
 */
struct	area_data
{
    AREA_DATA *		next;
    AREA_DATA *		prev;
    PLANET_DATA *       planet;
    ROOM_INDEX_DATA *   first_room;
    ROOM_INDEX_DATA *   last_room;
    char *		name;
    char *		filename;
    int                 flags;
};



/*
 * Used to keep track of system settings and statistics		-Thoric
 */
struct	system_data
{
  int maxplayers;		/* Maximum players this boot   */
  int alltimemax;		/* Maximum players ever	  */
  char *time_of_max;		/* Time of max ever */
  char *officials;		/* Elected Officials */
  bool NO_NAME_RESOLVING;	/* Hostnames are not resolved  */
  bool DENY_NEW_PLAYERS;	/* New players cannot connect  */
  bool WAIT_FOR_AUTH;		/* New players must be auth'ed */
  short max_sn;			/* Max skills */
  int save_flags;		/* Toggles for saving conditions */
  short	save_frequency;		/* How old to autosave someone */
  char *exe_filename;
  void *dl_handle;
  unsigned char *mccp_buf;
};

struct	vote_data
{
    VOTE_DATA * next;
    VOTE_DATA * prev;
    int		type;
    int		in_favour;
    int		against;
    char *	time_of_vote;
    char *	player;
    char *	ip_list;
    char *	name_list;
};


/*
 * Room type.
 */
struct	room_index_data
{
    ROOM_INDEX_DATA *	next;
    ROOM_INDEX_DATA *	next_in_area;
    ROOM_INDEX_DATA *	prev_in_area;
    ROOM_INDEX_DATA *	next_in_ship;
    ROOM_INDEX_DATA *	prev_in_ship;
    CHAR_DATA *		first_person;
    CHAR_DATA *		last_person;
    OBJ_DATA *		first_content;
    OBJ_DATA *		last_content;
    EXTRA_DESCR_DATA *	first_extradesc;
    EXTRA_DESCR_DATA *	last_extradesc;
    AREA_DATA *		area;
    EXIT_DATA *		first_exit;
    EXIT_DATA *		last_exit;
    SHIP_DATA * 	first_ship;
    SHIP_DATA * 	last_ship;	
    char *		name;
    char *		description;
    long		vnum;
    int			room_flags;
    MPROG_ACT_LIST *	mpact;               /* mudprogs */
    int			mpactnum;            /* mudprogs */
    MPROG_DATA *	mudprogs;            /* mudprogs */
    size_t		mpscriptpos;
    int			progtypes;           /* mudprogs */
    short		light;
    short		sector_type;
    long		tele_vnum;
    short		tele_delay;
    short		tunnel;		     /* max people that will fit */
};

/*
 * Delayed teleport type.
 */
struct	teleport_data
{
    TELEPORT_DATA *	next;
    TELEPORT_DATA *	prev;
    ROOM_INDEX_DATA *	room;
    short		timer;
};


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

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

typedef enum
{
  SKILL_UNKNOWN, SKILL_SPELL, SKILL_SKILL, SKILL_WEAPON
} skill_types;



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



/*
 * Skills include spells as a particular case.
 */
struct	skill_type
{
  char *	name;			/* Name of skill		*/
  SPELL_FUN *	spell_fun;		/* Spell pointer (for spells)	*/
  DO_FUN *	skill_fun;		/* Skill pointer (for skills)	*/
  char *fun_name;
  short	target;			/* Legal targets		*/
  short	minimum_position;	/* Position for caster / user	*/
  short	slot;			/* Slot for #OBJECT loading	*/
  short	min_mana;		/* Minimum mana used		*/
  short	beats;			/* Rounds required to use skill	*/
  char *	noun_damage;		/* Damage message		*/
  char *	msg_off;		/* Wear off message		*/
  short	type;			/* Spell/Skill/Weapon   	*/
  int		flags;			/* extra stuff			*/
  char *	hit_char;		/* Success message to caster	*/
  char *	hit_vict;		/* Success message to victim	*/
  char *	hit_room;		/* Success message to room	*/
  char *	miss_char;		/* Failure message to caster	*/
  char *	miss_vict;		/* Failure message to victim	*/
  char *	miss_room;		/* Failure message to room	*/
  char *	die_char;		/* Victim death msg to caster	*/
  char *	die_vict;		/* Victim death msg to victim	*/
  char *	die_room;		/* Victim death msg to room	*/
  char *	imm_char;		/* Victim immune msg to caster	*/
  char *	imm_vict;		/* Victim immune msg to victim	*/
  char *	imm_room;		/* Victim immune msg to room	*/
  char *	dice;			/* Dice roll			*/
  int		value;			/* Misc value			*/
  char	saves;			/* What saving spell applies	*/
  char	difficulty;		/* Difficulty of casting/learning */
  SMAUG_AFF *	affects;		/* Spell affects, if any	*/
  char *	components;		/* Spell components, if any	*/
  char	participants;		/* # of required participants	*/
  struct	timerset	userec;	/* Usage record			*/
  int         alignment;              /* for jedi powers */
};


struct  auction_data
{
    OBJ_DATA  * item;   /* a pointer to the item */
    CHAR_DATA * seller; /* a pointer to the seller - which may NOT quit */
    CHAR_DATA * buyer;  /* a pointer to the buyer - which may NOT quit */
    int         bet;    /* last bet - or 0 if noone has bet anything */
    short      going;  /* 1,2, sold */
    short      pulse;  /* how many pulses (.25 sec) until another call-out ? */
    int 	starting;
};


/*
 * These are skill_lookup return values for common skills and spells.
 */
extern short   gsn_spacecraft;
extern short   gsn_weaponsystems;
extern short   gsn_shipmaintenance; 
extern short   gsn_spacecombat;
extern short   gsn_shipdesign;

extern short   gsn_reinforcements;
extern short   gsn_postguard;

extern short   gsn_quicktalk;
extern short   gsn_propeganda;

extern short   gsn_torture;
extern short   gsn_throw;
extern short   gsn_disguise;
extern short   gsn_first_aid;

extern short   gsn_makeblade;
extern short   gsn_makejewelry;
extern short   gsn_makeblaster;
extern short   gsn_makelight;
extern short   gsn_makecomlink;
extern short   gsn_makearmor;
extern short   gsn_makeshield;
extern short   gsn_makecontainer;
extern short   gsn_lightsaber_crafting;
extern short   gsn_spice_refining;

extern short   gsn_survey;
extern short   gsn_landscape;
extern short   gsn_construction;
extern short   gsn_bridge;

extern	short	gsn_backstab;
extern  short  gsn_circle;
extern	short	gsn_dodge;
extern	short	gsn_hide;
extern	short	gsn_peek;
extern	short	gsn_pick_lock;
extern	short	gsn_sneak;
extern	short	gsn_steal;
extern	short	gsn_gouge;
extern	short	gsn_track;
extern	short	gsn_mount;
extern  short  gsn_bashdoor;
extern	short	gsn_berserk;
extern	short	gsn_hitall;
extern	short	gsn_pickshiplock;
extern	short	gsn_hijack;

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


extern	short	gsn_aid;

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

/* spells */
extern	short	gsn_blindness;
extern	short	gsn_charm_person;
extern  short  gsn_aqua_breath;
extern	short	gsn_invis;
extern	short	gsn_mass_invis;
extern	short	gsn_poison;
extern	short	gsn_sleep;
extern	short	gsn_stun;
extern  short  gsn_possess;
extern	short	gsn_fireball;
extern	short	gsn_lightning_bolt;


extern  short  gsn_poison_weapon;
extern	short	gsn_climb;

extern	short	gsn_blasters;
extern	short	gsn_force_pikes;
extern	short	gsn_bowcasters;
extern	short	gsn_lightsabers;
extern	short	gsn_vibro_blades;
extern	short	gsn_flexible_arms;
extern	short	gsn_talonous_arms;
extern	short	gsn_bludgeons;

extern  short  gsn_grip;

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

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

#define LEVEL_IMMORTAL 200

/*
 * Character macros.
 */
#define IS_NPC(ch)              (IS_SET((ch)->act, ACT_IS_NPC))
#define IS_IMMORTAL(ch)         ((ch)->top_level == LEVEL_IMMORTAL )
#define IS_OFFICIAL(ch)         (is_name((ch)->name,sysdata.officials))
#define IS_AFFECTED(ch, sn)     (IS_SET((ch)->affected_by, (sn)))
#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)              ( (ch)->armor + ( IS_AWAKE(ch) ? dex_app[get_curr_dex(ch)].defensive : 0 ) )
#define GET_HITROLL(ch)         ((ch)->hitroll                              \
				 +str_app[get_curr_str(ch)].tohit        \
				 +(2-(abs((ch)->mental_state)/10)))
#define GET_DAMROLL(ch)         ((ch)->damroll                              \
				 +str_app[get_curr_str(ch)].todam        \
				 +(((ch)->mental_state > 5               \
                                    &&(ch)->mental_state < 15) ? 1 : 0) )

#define IS_OUTSIDE(ch)          (!IS_SET(                                   \
					 (ch)->in_room->room_flags,              \
					 ROOM_INDOORS) && !IS_SET(               \
								  (ch)->in_room->room_flags,              \
								  ROOM_SPACECRAFT) && (ch)->in_room->sector_type != SECT_INSIDE )

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

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

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

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

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

/* Retired and guest imms. */
#define IS_RETIRED(ch) (ch->pcdata && IS_SET(ch->pcdata->flags,PCFLAG_RETIRED))
#define IS_GUEST(ch) (ch->pcdata && IS_SET(ch->pcdata->flags,PCFLAG_GUEST))

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

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

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

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


#define NOT_AUTHED(ch)		(!IS_NPC(ch) && ch->pcdata->auth_state <= 3  \
			      && IS_SET(ch->pcdata->flags, PCFLAG_UNAUTHED) )

#define IS_WAITING_FOR_AUTH(ch) (!IS_NPC(ch) && ch->desc		     \
			      && ch->pcdata->auth_state == 1		     \
			      && IS_SET(ch->pcdata->flags, PCFLAG_UNAUTHED) ) 

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



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



#define log_string( txt )	( log_string_plus( (txt), LOG_NORMAL ) )


/*
 * Structure for a command in the command lookup table.
 */
struct	cmd_type
{
  CMDTYPE *next;
  char *name;
  DO_FUN *do_fun;
  char *fun_name;
  short	position;
  short	level;
  short	log;
  struct timerset userec;
};



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



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

extern const struct model_type model[MAX_SHIP_MODEL+1];

extern const struct str_app_type str_app[26];
extern const struct int_app_type int_app[26];
extern const struct wis_app_type wis_app[26];
extern const struct dex_app_type dex_app[26];
extern const struct con_app_type con_app[26];
extern const struct cha_app_type cha_app[26];
extern const struct lck_app_type lck_app[26];
extern const struct frc_app_type frc_app[26];

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

extern const char * const skill_tname[];
extern short const movement_loss[SECT_MAX];
extern const char * const dir_name[];
extern const char * const where_name[];
extern const short rev_dir[];
extern const int trap_door[];
extern const char * const r_flags[];
extern const char * const w_flags[];
extern const char * const o_flags[];
extern const char * const a_flags[];
extern const char * const o_types[];
extern const char * const a_types[];
extern const char * const act_flags[];
extern const char * const planet_flags[];
extern const char * const weapon_table[13];
extern const char * const spice_table[];
extern const char * const plr_flags[];
extern const char * const pc_flags[];
extern const char * const trap_flags[];
extern const char * const ris_flags[];
extern const char * const trig_flags[];
extern const char * const defense_flags[];
extern const char * const attack_flags[];
extern const char * const area_flags[];
extern const char * const halucinated_object_short[];
extern const char * const halucinated_object_long[];
extern const char * const day_name[];
extern const char * const month_name[];
extern const char * const ex_flags [];
extern const char * const spell_flag[];
extern const char * const spell_saves[];
extern const char * const spell_damage[];
extern const char * const spell_action[];
extern const char * const spell_power[];
extern const char * const spell_class[];
extern const char * const target_type[];
extern const char * const corpse_descs[];
extern const char * const d_corpse_descs[];

/*
 * Global variables.
 */
extern int numobjsloaded;
extern int nummobsloaded;
extern int physicalobjects;
extern int num_descriptors;
extern struct system_data sysdata;
extern int top_sn;
extern int top_vroom;

extern CMDTYPE *command_hash[126];

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

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

extern HELP_DATA *first_help;
extern HELP_DATA *last_help;
extern SHOP_DATA *first_shop;
extern SHOP_DATA *last_shop;
extern REPAIR_DATA *first_repair;
extern REPAIR_DATA *last_repair;

extern BAN_DATA *first_ban;
extern BAN_DATA *last_ban;
extern BAN_DATA *first_tban;
extern BAN_DATA *last_tban;
extern CHAR_DATA *first_char;
extern CHAR_DATA *last_char;
extern DESCRIPTOR_DATA *first_descriptor;
extern DESCRIPTOR_DATA *last_descriptor;
extern BOARD_DATA *first_board;
extern BOARD_DATA *last_board;
extern OBJ_DATA *first_object;
extern OBJ_DATA *last_object;
extern CLAN_DATA *first_clan;
extern CLAN_DATA *last_clan;
extern GUARD_DATA *first_guard;
extern GUARD_DATA *last_guard;
extern SHIP_DATA *first_ship;
extern SHIP_DATA *last_ship;
extern SHIP_PROTOTYPE *first_ship_prototype;
extern SHIP_PROTOTYPE *last_ship_prototype;
extern SPACE_DATA *first_starsystem;
extern SPACE_DATA *last_starsystem;
extern PLANET_DATA *first_planet;
extern PLANET_DATA *last_planet;
extern VOTE_DATA *first_poll;
extern VOTE_DATA *last_poll;
extern AREA_DATA *first_area;
extern AREA_DATA *last_area;
extern AREA_DATA *first_build;
extern AREA_DATA *last_build;
extern TELEPORT_DATA *first_teleport;
extern TELEPORT_DATA *last_teleport;
extern OBJ_DATA *extracted_obj_queue;
extern EXTRACT_CHAR_DATA *extracted_char_queue;
extern OBJ_DATA *save_equipment[MAX_WEAR][MAX_LAYERS];
extern CHAR_DATA *quitting_char;
extern CHAR_DATA *loading_char;
extern CHAR_DATA *saving_char;
extern OBJ_DATA *al_obj;

extern char			bug_buf		[];
extern time_t			current_time;
extern bool			fLogAll;
extern char			log_buf		[];
extern TIME_INFO_DATA		time_info;
extern WEATHER_DATA		weather_info;

extern AUCTION_DATA      *     auction;
extern struct act_prog_data *	mob_act_list;

typedef enum
  {
    CLAN_PERM_INVALID = -1,
    CLAN_PERM_PILOT,
    CLAN_PERM_WITHDRAW,
    CLAN_PERM_BUYSHIP,
    CLAN_PERM_INDUCT,
    CLAN_PERM_OUTCAST,
    CLAN_PERM_EMPOWER,
    CLAN_PERM_BUILD,
    CLAN_PERM_WAR,
    CLAN_PERM_PAYROLL
  } clan_permission_type;

/*
 * Command functions.
 * Defined in act_*.c (mostly).
 */
DECLARE_DO_FUN( do_transship );
DECLARE_DO_FUN( do_copyover );
DECLARE_DO_FUN( do_arrest );
DECLARE_DO_FUN( do_setwages );
DECLARE_DO_FUN( do_war );
DECLARE_DO_FUN( do_prototypes );
DECLARE_DO_FUN( do_setprototype );
DECLARE_DO_FUN( do_showprototype );
DECLARE_DO_FUN( do_rentship );
DECLARE_DO_FUN( do_designship );
DECLARE_DO_FUN( do_disarm );
DECLARE_DO_FUN( do_resign );
DECLARE_DO_FUN( do_order );
DECLARE_DO_FUN( do_rat );
DECLARE_DO_FUN( do_gtell );
DECLARE_DO_FUN( do_forget );
DECLARE_DO_FUN( do_cast );
DECLARE_DO_FUN( do_aassign );
DECLARE_DO_FUN( do_shiptalk );
DECLARE_DO_FUN( do_systemtalk );
DECLARE_DO_FUN( do_gnet );
DECLARE_DO_FUN( do_pnet );
DECLARE_DO_FUN( do_bridge );
DECLARE_DO_FUN( do_construction );
DECLARE_DO_FUN( do_survey );
DECLARE_DO_FUN( do_landscape );
DECLARE_DO_FUN( do_allsave );
DECLARE_DO_FUN( do_setplanet );
DECLARE_DO_FUN( do_makeplanet );
DECLARE_DO_FUN( do_planets );
DECLARE_DO_FUN( do_teach );
DECLARE_DO_FUN( do_quicktalk );
DECLARE_DO_FUN( do_propeganda );
DECLARE_DO_FUN( do_autopilot  );
DECLARE_DO_FUN( do_allspeeders  );
DECLARE_DO_FUN( do_speeders  );
DECLARE_DO_FUN( do_suicide  );
DECLARE_DO_FUN( do_bank  );
DECLARE_DO_FUN( do_hijack  );
DECLARE_DO_FUN( do_pickshiplock  );
DECLARE_DO_FUN( do_hail );
DECLARE_DO_FUN( do_allships );
DECLARE_DO_FUN( do_appoint );
DECLARE_DO_FUN( do_demote );
DECLARE_DO_FUN( do_empower );
DECLARE_DO_FUN( do_capture );
DECLARE_DO_FUN( do_chaff );
DECLARE_DO_FUN( do_clan_donate );
DECLARE_DO_FUN( do_clan_withdraw );
DECLARE_DO_FUN( do_fly );
DECLARE_DO_FUN( do_drive );
DECLARE_DO_FUN( do_bomb );
DECLARE_DO_FUN( do_setblaster );
DECLARE_DO_FUN( do_ammo );
DECLARE_DO_FUN( do_use ); 
DECLARE_DO_FUN( do_makearmor );
DECLARE_DO_FUN( do_makejewelry );
DECLARE_DO_FUN( do_makeshield );
DECLARE_DO_FUN( do_makecontainer );
DECLARE_DO_FUN( do_reinforcements );
DECLARE_DO_FUN( do_postguard );
DECLARE_DO_FUN( do_torture );
DECLARE_DO_FUN( do_snipe );
DECLARE_DO_FUN( do_throw );
DECLARE_DO_FUN( do_disguise );
DECLARE_DO_FUN( do_first_aid);
DECLARE_DO_FUN( do_makeblade ); 
DECLARE_DO_FUN( do_makeblaster );
DECLARE_DO_FUN( do_makelightsaber );
DECLARE_DO_FUN( do_closebay );
DECLARE_DO_FUN( do_overthrow );
DECLARE_DO_FUN( do_openbay );
DECLARE_DO_FUN( do_autotrack );
DECLARE_DO_FUN( do_tractorbeam ); 
DECLARE_DO_FUN( do_radar );
DECLARE_DO_FUN( do_recall ); 
DECLARE_DO_FUN( do_buyship );
DECLARE_DO_FUN( do_buyhome );
DECLARE_DO_FUN( do_clanbuyship );
DECLARE_DO_FUN( do_sellship );
DECLARE_DO_FUN( do_autorecharge );
DECLARE_DO_FUN( do_openhatch );
DECLARE_DO_FUN( do_closehatch );
DECLARE_DO_FUN( do_status );
DECLARE_DO_FUN( do_info );
DECLARE_DO_FUN( do_hyperspace );
DECLARE_DO_FUN( do_target );
DECLARE_DO_FUN( do_fire );
DECLARE_DO_FUN( do_calculate );
DECLARE_DO_FUN( do_recharge );
DECLARE_DO_FUN( do_repairship );
DECLARE_DO_FUN( do_addpilot );
DECLARE_DO_FUN( do_rempilot);
DECLARE_DO_FUN( do_trajectory );
DECLARE_DO_FUN( do_accelerate );
DECLARE_DO_FUN( do_launch );
DECLARE_DO_FUN( do_land ); 
DECLARE_DO_FUN( do_leaveship ); 
DECLARE_DO_FUN( do_setstarsystem );
DECLARE_DO_FUN( do_starsystems ); 
DECLARE_DO_FUN( do_showstarsystem );
DECLARE_DO_FUN( skill_notfound	);
DECLARE_DO_FUN(	do_advance	);
DECLARE_DO_FUN( do_affected     );
DECLARE_DO_FUN( do_afk          );
DECLARE_DO_FUN(	do_aid		);
DECLARE_DO_FUN(	do_allow	);
DECLARE_DO_FUN( do_ansi		);
DECLARE_DO_FUN(	do_appraise	);
DECLARE_DO_FUN(	do_areas	);
DECLARE_DO_FUN( do_aset		);
DECLARE_DO_FUN( do_astat	);
DECLARE_DO_FUN(	do_at		);
DECLARE_DO_FUN(	do_auction	);
DECLARE_DO_FUN( do_authorize	);
DECLARE_DO_FUN(	do_backstab	);
DECLARE_DO_FUN(	do_balzhur	);
DECLARE_DO_FUN(	do_bamfin	);
DECLARE_DO_FUN(	do_bamfout	);
DECLARE_DO_FUN(	do_ban		);
DECLARE_DO_FUN( do_bashdoor     );
DECLARE_DO_FUN( do_beep         );
DECLARE_DO_FUN( do_berserk	);
DECLARE_DO_FUN( do_bestow	);
DECLARE_DO_FUN( do_bestowarea	);
DECLARE_DO_FUN(	do_bio		);
DECLARE_DO_FUN( do_board        );
DECLARE_DO_FUN( do_boards	);
DECLARE_DO_FUN( do_bodybag	);
DECLARE_DO_FUN( do_bset		);
DECLARE_DO_FUN( do_bstat	);
DECLARE_DO_FUN(	do_bug		);
DECLARE_DO_FUN( do_bury		);
DECLARE_DO_FUN(	do_buy		);
DECLARE_DO_FUN(	do_cedit	);
DECLARE_DO_FUN(	do_channels	);
DECLARE_DO_FUN(	do_ooc		);
DECLARE_DO_FUN( do_circle	);
DECLARE_DO_FUN(	do_clans	);
DECLARE_DO_FUN( do_ships        );
DECLARE_DO_FUN(	do_clantalk	);
DECLARE_DO_FUN(	do_climb	);
DECLARE_DO_FUN( do_clone    );
DECLARE_DO_FUN(	do_close	);
DECLARE_DO_FUN(	do_cmdtable	);
DECLARE_DO_FUN(	do_commands	);
DECLARE_DO_FUN(	do_compare	);
DECLARE_DO_FUN(	do_config	);
DECLARE_DO_FUN(	do_consider	);
DECLARE_DO_FUN( do_credits	);
DECLARE_DO_FUN(	do_cset		);
DECLARE_DO_FUN(	do_deny		);
DECLARE_DO_FUN(	do_description	);
DECLARE_DO_FUN( do_destroy      );
DECLARE_DO_FUN( do_dig		);
DECLARE_DO_FUN(	do_disconnect	);
DECLARE_DO_FUN( do_dismount	);
DECLARE_DO_FUN(	do_dmesg	);
DECLARE_DO_FUN(	do_down		);
DECLARE_DO_FUN( do_drag 	);
DECLARE_DO_FUN(	do_drink	);
DECLARE_DO_FUN(	do_drop		);
DECLARE_DO_FUN(	do_east		);
DECLARE_DO_FUN(	do_eat		);
DECLARE_DO_FUN(	do_echo		);
DECLARE_DO_FUN(	do_emote	);
DECLARE_DO_FUN(	do_empty	);
DECLARE_DO_FUN(	do_enter	);
DECLARE_DO_FUN(	do_equipment	);
DECLARE_DO_FUN(	do_examine	);
DECLARE_DO_FUN(	do_exits	);
DECLARE_DO_FUN(	do_fill		);
DECLARE_DO_FUN(	do_fixchar	);
DECLARE_DO_FUN(	do_flee		);
DECLARE_DO_FUN( do_foldarea	);
DECLARE_DO_FUN(	do_follow	);
DECLARE_DO_FUN( do_for          );
DECLARE_DO_FUN(	do_force	);
DECLARE_DO_FUN( do_forceclose	);
DECLARE_DO_FUN( do_form_password);
DECLARE_DO_FUN(	do_freeze	);
DECLARE_DO_FUN(	do_get		);
DECLARE_DO_FUN(	do_give		);
DECLARE_DO_FUN(	do_glance	);
DECLARE_DO_FUN( do_gold         );
DECLARE_DO_FUN(	do_goto		);
DECLARE_DO_FUN( do_gouge	);
DECLARE_DO_FUN(	do_group	);
DECLARE_DO_FUN( do_hedit	);
DECLARE_DO_FUN(	do_help		);
DECLARE_DO_FUN(	do_hide		);
DECLARE_DO_FUN( do_hitall	);
DECLARE_DO_FUN( do_hlist	);
DECLARE_DO_FUN(	do_holylight	);
DECLARE_DO_FUN(	do_homepage	);
DECLARE_DO_FUN( do_hset		);
DECLARE_DO_FUN(	do_immortalize	);
DECLARE_DO_FUN(	do_immtalk	);
DECLARE_DO_FUN(	do_induct	);
DECLARE_DO_FUN(	do_inventory	);
DECLARE_DO_FUN(	do_invis	);
DECLARE_DO_FUN(	do_kick		);
DECLARE_DO_FUN(	do_kill		);
DECLARE_DO_FUN( do_last		);
DECLARE_DO_FUN(	do_leave	);
DECLARE_DO_FUN(	do_list		);
DECLARE_DO_FUN( do_loadup	);
DECLARE_DO_FUN(	do_lock		);
DECLARE_DO_FUN(	do_log		);
DECLARE_DO_FUN(	do_look		);
DECLARE_DO_FUN(	do_low_purge	);
DECLARE_DO_FUN( do_mailroom	);
DECLARE_DO_FUN(	do_make		);
DECLARE_DO_FUN(	do_makeboard	);
DECLARE_DO_FUN(	do_makeclan	);
DECLARE_DO_FUN( do_makeship     );
DECLARE_DO_FUN( do_makerepair	);
DECLARE_DO_FUN( do_makeshop	);
DECLARE_DO_FUN(	do_memory	);
DECLARE_DO_FUN( do_mcreate	);
DECLARE_DO_FUN(	do_mfind	);
DECLARE_DO_FUN(	do_minvoke	);
DECLARE_DO_FUN( do_mlist	);
DECLARE_DO_FUN( do_mount	);
DECLARE_DO_FUN(	do_mset		);
DECLARE_DO_FUN(	do_mstat	);
DECLARE_DO_FUN(	do_murder	);
DECLARE_DO_FUN(	do_mwhere	);
DECLARE_DO_FUN( do_newbiechat   );
DECLARE_DO_FUN( do_newbieset    );
DECLARE_DO_FUN(	do_noemote	);
DECLARE_DO_FUN( do_noresolve	);
DECLARE_DO_FUN(	do_north	);
DECLARE_DO_FUN( do_northeast	);
DECLARE_DO_FUN( do_northwest	);
DECLARE_DO_FUN(	do_notell	);
DECLARE_DO_FUN( do_notitle      );
DECLARE_DO_FUN(	do_noteroom	);
DECLARE_DO_FUN( do_ocreate	);
DECLARE_DO_FUN(	do_ofind	);
DECLARE_DO_FUN(	do_oinvoke	);
DECLARE_DO_FUN(	do_oldscore	);
DECLARE_DO_FUN( do_olist	);
DECLARE_DO_FUN(	do_open		);
DECLARE_DO_FUN(	do_oset		);
DECLARE_DO_FUN(	do_ostat	);
DECLARE_DO_FUN(	do_outcast	);
DECLARE_DO_FUN(	do_owhere	);
DECLARE_DO_FUN( do_pager	);
DECLARE_DO_FUN(	do_password	);
DECLARE_DO_FUN(	do_peace	);
DECLARE_DO_FUN(	do_pick		);
DECLARE_DO_FUN( do_poison_weapon);
DECLARE_DO_FUN( do_prompt	);
DECLARE_DO_FUN(	do_purge	);
DECLARE_DO_FUN(	do_put		);
DECLARE_DO_FUN(	do_quit		);
DECLARE_DO_FUN(	do_rank	        );
DECLARE_DO_FUN(	do_reboot	);
DECLARE_DO_FUN(	do_recho	);
DECLARE_DO_FUN(	do_redit	);
DECLARE_DO_FUN( do_regoto       );
DECLARE_DO_FUN(	do_remove	);
DECLARE_DO_FUN(	do_repair	);
DECLARE_DO_FUN(	do_repairset	);
DECLARE_DO_FUN(	do_repairshops	);
DECLARE_DO_FUN(	do_repairstat	);
DECLARE_DO_FUN(	do_reply	);
DECLARE_DO_FUN(	do_rescue	);
DECLARE_DO_FUN(	do_rest		);
DECLARE_DO_FUN( do_reset	);
DECLARE_DO_FUN( do_resetship	);
DECLARE_DO_FUN(	do_restore	);
DECLARE_DO_FUN(	do_restoretime	);
DECLARE_DO_FUN(	do_restrict	);
DECLARE_DO_FUN( do_retire       );
DECLARE_DO_FUN( do_retran       );
DECLARE_DO_FUN(	do_return	);
DECLARE_DO_FUN(	do_revert	);
DECLARE_DO_FUN( do_rlist	);
DECLARE_DO_FUN(	do_rstat	);
DECLARE_DO_FUN(	do_save		);
DECLARE_DO_FUN(	do_say		);
DECLARE_DO_FUN( do_scan         );
DECLARE_DO_FUN(	do_score	);
DECLARE_DO_FUN( do_search	);
DECLARE_DO_FUN(	do_sedit	);
DECLARE_DO_FUN(	do_sell		);
DECLARE_DO_FUN( do_set_boot_time);
DECLARE_DO_FUN( do_setclan	);
DECLARE_DO_FUN( do_setship      );
DECLARE_DO_FUN(	do_shops	);
DECLARE_DO_FUN(	do_shopset	);
DECLARE_DO_FUN(	do_shopstat	);
DECLARE_DO_FUN( do_shove  	);
DECLARE_DO_FUN( do_showclan	);
DECLARE_DO_FUN( do_showship     );
DECLARE_DO_FUN( do_showplanet   );
DECLARE_DO_FUN(	do_shutdown	);
DECLARE_DO_FUN(	do_silence	);
DECLARE_DO_FUN(	do_sit		);
DECLARE_DO_FUN( do_skills   );
DECLARE_DO_FUN(	do_slay		);
DECLARE_DO_FUN(	do_sleep	);
DECLARE_DO_FUN( do_slice        );
DECLARE_DO_FUN( do_slist        );
DECLARE_DO_FUN(	do_slookup	);
DECLARE_DO_FUN(	do_sneak	);
DECLARE_DO_FUN(	do_snoop	);
DECLARE_DO_FUN(	do_sober	);
DECLARE_DO_FUN(	do_socials	);
DECLARE_DO_FUN(	do_south	);
DECLARE_DO_FUN(	do_southeast	);
DECLARE_DO_FUN(	do_southwest	);
DECLARE_DO_FUN(	do_split	);
DECLARE_DO_FUN(	do_sset		);
DECLARE_DO_FUN(	do_stand	);
DECLARE_DO_FUN(	do_steal	);
DECLARE_DO_FUN(	do_switch	);
DECLARE_DO_FUN(	do_tell		);
DECLARE_DO_FUN(	do_time		);
DECLARE_DO_FUN(	do_timecmd	);
DECLARE_DO_FUN(	do_title	);
DECLARE_DO_FUN( do_track	);
DECLARE_DO_FUN(	do_transfer	);
DECLARE_DO_FUN(	do_trust	);
DECLARE_DO_FUN(	do_typo		);
DECLARE_DO_FUN(	do_unfoldarea	);
DECLARE_DO_FUN(	do_unlock	);
DECLARE_DO_FUN( do_unsilence    );
DECLARE_DO_FUN(	do_up		);
DECLARE_DO_FUN(	do_users	);
DECLARE_DO_FUN(	do_value	);
DECLARE_DO_FUN(	do_visible	);
DECLARE_DO_FUN( do_vnums	);
DECLARE_DO_FUN( do_vsearch	);
DECLARE_DO_FUN(	do_wake		);
DECLARE_DO_FUN(	do_wear		);
DECLARE_DO_FUN(	do_weather	);
DECLARE_DO_FUN(	do_west		);
DECLARE_DO_FUN(	do_where	);
DECLARE_DO_FUN(	do_who		);
DECLARE_DO_FUN(	do_whois	);
DECLARE_DO_FUN(	do_wimpy	);
DECLARE_DO_FUN(	do_wizhelp	);
DECLARE_DO_FUN( do_wizlist	);
DECLARE_DO_FUN(	do_wizlock	);
DECLARE_DO_FUN(	do_yell		);
DECLARE_DO_FUN( do_zones	);

/* mob prog stuff */
DECLARE_DO_FUN( do_mp_offer_job );
DECLARE_DO_FUN( do_mp_close_passage );
DECLARE_DO_FUN( do_mp_damage );
DECLARE_DO_FUN( do_mp_restore );
DECLARE_DO_FUN( do_mp_open_passage );
DECLARE_DO_FUN( do_mp_practice );
DECLARE_DO_FUN( do_mp_slay);
DECLARE_DO_FUN( do_mpadvance    );
DECLARE_DO_FUN( do_mpasound     );
DECLARE_DO_FUN( do_mpat         );
DECLARE_DO_FUN( do_mpdream	);
DECLARE_DO_FUN( do_mp_deposit	);
DECLARE_DO_FUN( do_mp_withdraw	);
DECLARE_DO_FUN( do_mpecho       );
DECLARE_DO_FUN( do_mpechoaround );
DECLARE_DO_FUN( do_mpechoat     );
DECLARE_DO_FUN( do_mpedit       );
DECLARE_DO_FUN( do_opedit       );
DECLARE_DO_FUN( do_rpedit       );
DECLARE_DO_FUN( do_mpforce      );
DECLARE_DO_FUN( do_mpinvis	);
DECLARE_DO_FUN( do_mpgoto       );
DECLARE_DO_FUN( do_mpjunk       );
DECLARE_DO_FUN( do_mpkill       );
DECLARE_DO_FUN( do_mpmload      );
DECLARE_DO_FUN( do_mpnothing	);
DECLARE_DO_FUN( do_mpoload      );
DECLARE_DO_FUN( do_mppurge      );
DECLARE_DO_FUN( do_mpstat       );
DECLARE_DO_FUN( do_opstat       );
DECLARE_DO_FUN( do_rpstat       );
DECLARE_DO_FUN( do_mptransfer   );
DECLARE_DO_FUN( do_mpapply	);
DECLARE_DO_FUN( do_mpapplyb  	);
DECLARE_DO_FUN( do_mppkset	);
DECLARE_DO_FUN( do_mpgain	);

/*
 * Spell functions.
 * Defined in magic.c.
 */
DECLARE_SPELL_FUN(	spell_null		);
DECLARE_SPELL_FUN(	spell_notfound		);
DECLARE_SPELL_FUN(	spell_blindness		);
DECLARE_SPELL_FUN(	spell_charm_person	);
DECLARE_SPELL_FUN(	spell_fireball		);
DECLARE_SPELL_FUN(	spell_identify		);
DECLARE_SPELL_FUN(	spell_invis		);
DECLARE_SPELL_FUN(	spell_lightning_bolt	);
DECLARE_SPELL_FUN(	spell_poison		);
DECLARE_SPELL_FUN(	spell_possess		);
DECLARE_SPELL_FUN(	spell_sleep		);
DECLARE_SPELL_FUN(	spell_smaug		);

/*
 * Data files used by the server.
 *
 * AREA_LIST contains a list of areas to boot.
 * All files are read in completely at bootup.
 * Most output files (bug, idea, typo, shutdown) are append-only.
 *
 * The NULL_FILE is held open so that we have a stream handle in reserve,
 *   so players can go ahead and telnet to all the other descriptors.
 * Then we close it whenever we need to open a file (e.g. a save file).
 */
#define PLAYER_DIR	"player/" /* Player files		*/
#define BACKUP_DIR	"backup/" /* Backup Player files		*/
#define BOARD_DIR	"boards/" /* Board data dir		*/
#define CLAN_DIR	"clans/"	/* Clan data dir		*/
#define SHIP_DIR        "spacecraft/"
#define VOTE_DIR        "voting/"
#define PROTOTYPE_DIR   "prototypes/"
#define SPACE_DIR       "planets/"    
#define PLANET_DIR      "planets/"    
#define GUARD_DIR       "planets/"    
#define SYSTEM_DIR	"system/" /* Main system files		*/
#define PROG_DIR	"mudprogs/"	/* MUDProg files		*/
#define CORPSE_DIR	"corpses/" /* Corpses			*/
#define AREA_DIR        "area/"
#define AREA_LIST	"area.lst"	/* List of areas		*/
#define BAN_LIST        "ban.lst"       /* List of bans                 */
#define CLAN_LIST	"clan.lst"	/* List of clans		*/
#define SHIP_LIST       "ship.lst"
#define PROTOTYPE_LIST  "prototype.lst"
#define PLANET_LIST      "planet.lst"
#define SPACE_LIST      "space.lst"
#define VOTE_LIST       "vote.lst"      

#define HELP_FILE       SYSTEM_DIR "help.dat"
#define BOARD_FILE	"boards.txt"		/* For bulletin boards	 */
#define SHUTDOWN_FILE	"shutdown.txt"		/* For 'shutdown'	 */
#define COPYOVER_FILE   SYSTEM_DIR "copyover.dat"
#define BOOTLOG_FILE	SYSTEM_DIR "boot.txt"	  /* Boot up error file	 */
#define BUG_FILE	SYSTEM_DIR "bugs.txt"	  /* For 'bug' and bug( )*/
#define TYPO_FILE	SYSTEM_DIR "typos.txt"	  /* For 'typo'		 */
#define LOG_FILE	SYSTEM_DIR "log.txt"	  /* For talking in logged rooms */
#define SKILL_FILE	SYSTEM_DIR "skills.dat"   /* Skill table	 */
#define SOCIAL_FILE	SYSTEM_DIR "socials.dat"  /* Socials		 */
#define COMMAND_FILE	SYSTEM_DIR "commands.dat" /* Commands		 */
#define USAGE_FILE	SYSTEM_DIR "usage.txt"    /* How many people are on 
 						     every half hour - trying to
						     determine best reboot time */

/*
 * Our function prototypes.
 * One big lump ... this is every function in Merc.
 */
#ifdef __cplusplus
extern "C" {
#endif

/* act_comm.c */
bool character_has_comlink( const CHAR_DATA *ch );
void sound_to_room( const ROOM_INDEX_DATA *room , const char *argument );
bool circle_follow( const CHAR_DATA *ch, const CHAR_DATA *victim );
void add_follower( CHAR_DATA *ch, CHAR_DATA *master );
void stop_follower( CHAR_DATA *ch );
void die_follower( CHAR_DATA *ch );
bool is_same_group( const CHAR_DATA *ach, const CHAR_DATA *bch );
void to_channel( const char *argument, int channel,
		 const char *verb, short level );
void talk_auction( const char *argument );
char *obj_short( const OBJ_DATA *obj );

/* act_info.c */
int get_door( const char *arg );
char *format_obj_to_char( const OBJ_DATA *obj, CHAR_DATA *ch, bool fShort );
void show_list_to_char( const OBJ_DATA *list, CHAR_DATA *ch,
			bool fShort, bool fShowNothing );
void log_printf( const char *fmt, ... );
void copyover_recover( void );

/* act_move.c */
void clear_vrooms( void );
EXIT_DATA *find_door( CHAR_DATA *ch, const char *arg, bool quiet );
EXIT_DATA *get_exit( const ROOM_INDEX_DATA *room, short dir );
EXIT_DATA *get_exit_to( const ROOM_INDEX_DATA *room, short dir, long vnum );
EXIT_DATA *get_exit_num( const ROOM_INDEX_DATA *room, short count );
ch_ret move_char( CHAR_DATA *ch, EXIT_DATA *pexit, int fall );
void teleport( CHAR_DATA *ch, short room, int flags );
short encumbrance( const CHAR_DATA *ch, short move );
bool will_fall( CHAR_DATA *ch, int fall );
int wherehome( const CHAR_DATA *ch );

/* act_obj.c */
obj_ret damage_obj( OBJ_DATA *obj );
short get_obj_resistance( const OBJ_DATA *obj );
void obj_fall( OBJ_DATA *obj, bool through );

/* act_wiz.c */
void close_area( AREA_DATA *pArea );
ROOM_INDEX_DATA *find_location( CHAR_DATA *ch, const char *arg );
void echo_to_room( short AT_COLOR, const ROOM_INDEX_DATA *room,
		   const char *argument );
void echo_to_all( short AT_COLOR, const char *argument, short tar );
void echo_to_area( const AREA_DATA * area, short AT_COLOR,
		   const char *argument, short tar );
void get_reboot_string( void );
void free_social( SOCIALTYPE *social );
void add_social( SOCIALTYPE *social );
void free_command( CMDTYPE *command );
void unlink_command( CMDTYPE *command );
void add_command( CMDTYPE *command );

/* boards.c */
void load_boards( void );
BOARD_DATA * get_board( const OBJ_DATA *obj );
void free_note( NOTE_DATA *pnote );

/* build.c */
int get_dir( const char *txt  );
int get_vip_flag( const char *flag );
int get_wanted_flag( const char *flag );
void save_some_areas( void );

/* clans.c */
bool clan_char_has_permission( const CLAN_DATA *clan,
			       const CHAR_DATA *ch, int perm );
bool clan_char_is_leader( const CLAN_DATA*, const CHAR_DATA* );
void clan_remove_leader( CLAN_DATA *ch, const char *name );
void clan_decrease_vehicles_owned( CLAN_DATA *clan, const SHIP_DATA *ship );
CLAN_DATA *get_clan( const char *name );
void load_clans( void );
void save_clan( const CLAN_DATA *clan );

/* vote.c */
void load_polls( void );
void save_poll( const VOTE_DATA *poll );

/* colony.c */
void room_set_sector( ROOM_INDEX_DATA *room, int sector_type );
void make_colony_room_exits( ROOM_INDEX_DATA *location, int room_type );
void make_default_colony_supply_shop( PLANET_DATA *planet,
				      ROOM_INDEX_DATA *location );
void make_default_colony_center( PLANET_DATA *planet,
				 ROOM_INDEX_DATA *location );
void make_default_colony_shuttle_platform( PLANET_DATA *planet,
					   ROOM_INDEX_DATA *location );
void make_default_colony_hotel( PLANET_DATA *planet,
				ROOM_INDEX_DATA *location );
void make_default_colony_wilderness( PLANET_DATA *planet,
				     ROOM_INDEX_DATA *location,
				     const char *description );

/* planets.c */
PLANET_DATA *get_planet( const char *name );
void load_planets( void );
void save_planet( const PLANET_DATA *planet );
int max_population( const PLANET_DATA *planet );
long get_taxes( const PLANET_DATA *planet );

/* space.c */
void write_area_list( void );
void write_starsystem_list( void );
SHIP_DATA *ship_create( void );
SPACE_DATA *starsystem_create( void );
SHIP_DATA *get_ship( const char *name );
void load_ships( void );
void save_ship( const SHIP_DATA *ship );
void load_space( void );
void save_starsystem( const SPACE_DATA *starsystem );
SPACE_DATA *starsystem_from_name( const char *name );
SPACE_DATA *starsystem_from_room( const ROOM_INDEX_DATA * room );
SHIP_DATA *ship_from_entrance( const ROOM_INDEX_DATA * room );
SHIP_DATA *ship_from_room( const ROOM_INDEX_DATA * room );
SHIP_DATA *ship_from_pilotseat( const ROOM_INDEX_DATA * room );
SHIP_DATA *ship_from_cockpit( const ROOM_INDEX_DATA * room );
SHIP_DATA *ship_from_turret( const ROOM_INDEX_DATA * room );
SHIP_DATA *ship_from_engine( const ROOM_INDEX_DATA * room );
SHIP_DATA *ship_from_pilot( const char *name );
SHIP_DATA *get_ship_here( const char *name, const SPACE_DATA *starsystem );
void update_space( void );
void recharge_ships( void );
void move_missiles( void );
void move_ships( void );
void update_bus( void );
void update_traffic( void );
bool check_pilot( const CHAR_DATA *ch , const SHIP_DATA *ship );
void echo_to_ship( int color , const SHIP_DATA *ship , const char *argument );
void echo_to_cockpit( int color, const SHIP_DATA *ship, const char *argument );
void echo_to_system( int color , const SHIP_DATA *ship , const char *argument,
		     const SHIP_DATA *ignore );
bool extract_ship( SHIP_DATA *ship );
bool ship_to_room( SHIP_DATA *ship , long vnum );
void damage_ship( SHIP_DATA *ship , int min , int max , CHAR_DATA *ch );
void destroy_ship( SHIP_DATA *ship , CHAR_DATA *ch );
void ship_to_starsystem( SHIP_DATA *ship , SPACE_DATA *starsystem );
void ship_from_starsystem( SHIP_DATA *ship , SPACE_DATA *starsystem );
void new_missile( SHIP_DATA *ship , SHIP_DATA *target , CHAR_DATA *ch );
void extract_missile( MISSILE_DATA *missile );
SHIP_DATA * ship_in_room( const ROOM_INDEX_DATA *room, const char *name ); 

/* morespace.c */
SHIP_PROTOTYPE *get_ship_prototype( const char *name );
SHIP_DATA *make_ship( const SHIP_PROTOTYPE *protoype );
void load_prototypes( void );
void save_ship_protoype( const SHIP_PROTOTYPE *prototype );
long int get_prototype_value( const SHIP_PROTOTYPE *prototype );
void create_ship_rooms( SHIP_DATA * ship );

/* comm.c */
void close_socket( DESCRIPTOR_DATA *dclose, bool force );
void write_to_buffer( DESCRIPTOR_DATA *d, const char *txt, size_t length );
void write_to_pager( DESCRIPTOR_DATA *d, const char *txt, size_t length );
void send_to_char_color( const char *txt, const CHAR_DATA *ch );
void send_to_pager_color( const char *txt, const CHAR_DATA *ch );
void set_char_color( short AType, CHAR_DATA *ch );
void set_pager_color( short AType, CHAR_DATA *ch );
void ch_printf( const CHAR_DATA *ch, const char *fmt, ... );
void pager_printf(const CHAR_DATA *ch, const char *fmt, ...);
void act( short AType, const char *format, CHAR_DATA *ch,
	  const void *arg1, const void *arg2, int type );

/* reset.c */
void reset_all( void );

/* const.c */
size_t weapon_table_size( void );
size_t attack_table_size( void );
size_t sector_names_size( void );
const char *get_sector_name( int sect );
int get_sector_type( const char *sect );
const char *get_position_name( int pos );
int get_position( const char *pos_name );
size_t position_name_size( void );
size_t halucinated_object_short_size( void );
size_t halucinated_object_long_size( void );
int get_trapflag( const char *flag );
int get_wearloc( const char *type );
int get_exflag( const char *flag );
int get_rflag( const char *flag );
int get_mpflag( const char *flag );
int get_areaflag( const char *flag );
int get_actflag( const char *flag );
int get_pcflag( const char *flag );
int get_plrflag( const char *flag );
int get_risflag( const char *flag );
int get_trigflag( const char *flag );
int get_attackflag( const char *flag );
int get_defenseflag( const char *flag );
int get_ssave( const char *name );
int get_starget( const char *name );
int get_sflag( const char *name );
int get_sdamage( const char *name );
int get_saction( const char *name );
int get_spower( const char *name );
int get_sclass( const char *name );

/* db.c */
void free_extra_descr( EXTRA_DESCR_DATA *ed );
void free_shop( SHOP_DATA* );
void free_help( HELP_DATA* );
void free_ban( BAN_DATA* );
void save_sysdata( void );
bool is_valid_filename( const CHAR_DATA *ch, const char *direct,
			const char *filename );
void show_file( const CHAR_DATA *ch, const char *filename );
void boot_db( bool fCopyOver );
void area_update( void );
void add_char( CHAR_DATA *ch );
CHAR_DATA *create_mobile( MOB_INDEX_DATA *pMobIndex );
OBJ_DATA *create_object( OBJ_INDEX_DATA *pObjIndex );
void clear_char( CHAR_DATA *ch );
void free_char( CHAR_DATA *ch );
char *get_extra_descr( const char *name, EXTRA_DESCR_DATA *ed );
MOB_INDEX_DATA *get_mob_index( long vnum );
OBJ_INDEX_DATA *get_obj_index( long vnum );
ROOM_INDEX_DATA *get_room_index( long vnum );
void append_file( CHAR_DATA *ch, const char *file, const char *str );
void bug( const char *str, ... );
void log_string_plus( const char *str, short log_type );
ROOM_INDEX_DATA *make_room( long vnum );
ROOM_INDEX_DATA *make_ship_room( SHIP_DATA * ship );
OBJ_INDEX_DATA *make_object( long vnum, long cvnum, char *name );
MOB_INDEX_DATA *make_mobile( long vnum, long cvnum, char *name );
void make_bexit( ROOM_INDEX_DATA *location, ROOM_INDEX_DATA *troom,
		 int direction );
EXIT_DATA *make_exit( ROOM_INDEX_DATA *pRoomIndex,
		      ROOM_INDEX_DATA *to_room, short door );
void add_help( HELP_DATA *pHelp );
void fix_area_exits( AREA_DATA *tarea );
void load_area_file( AREA_DATA *tarea, const char *filename );
void randomize_exits( ROOM_INDEX_DATA *room, short maxdir );
bool delete_room( ROOM_INDEX_DATA *room );
bool delete_obj( OBJ_INDEX_DATA *obj );
bool delete_mob( MOB_INDEX_DATA *mob );
void load_votes( void );
void save_votes( void );

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

/* fight.c */
int max_fight( const CHAR_DATA *ch );
void violence_update( void );
ch_ret multi_hit( CHAR_DATA *ch, CHAR_DATA *victim, int dt );
short ris_damage( const CHAR_DATA *ch, short dam, int ris );
ch_ret damage( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt );
void update_pos( CHAR_DATA *victim );
void set_fighting( CHAR_DATA *ch, CHAR_DATA *victim );
void stop_fighting( CHAR_DATA *ch, bool fBoth );
void free_fight( CHAR_DATA *ch );
CHAR_DATA * who_fighting( const CHAR_DATA *ch );
void stop_hunting( CHAR_DATA *ch );
void stop_hating( CHAR_DATA *ch );
void stop_fearing( CHAR_DATA *ch );
void start_hunting( CHAR_DATA *ch, CHAR_DATA *victim );
void start_hating( CHAR_DATA *ch, CHAR_DATA *victim );
void start_fearing( CHAR_DATA *ch, CHAR_DATA *victim );
bool is_hunting( const CHAR_DATA *ch, const CHAR_DATA *victim );
bool is_hating( const CHAR_DATA *ch, const CHAR_DATA *victim );
bool is_fearing( const CHAR_DATA *ch, const CHAR_DATA *victim );
bool is_safe( CHAR_DATA *ch, const CHAR_DATA *victim );
bool legal_loot( const CHAR_DATA *ch, const CHAR_DATA *victim );
void raw_kill( CHAR_DATA *ch, CHAR_DATA *victim );   

/* makeobjs.c */
void make_corpse( const CHAR_DATA *ch );
void make_scraps( OBJ_DATA *obj );
OBJ_DATA *make_trap( int v0, int v1, int v2, int v3 );
OBJ_DATA *create_money( int amount );

/* misc.c */
void actiondesc( CHAR_DATA *ch, const OBJ_DATA *obj, void *vo );

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

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

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

/* player.c */
void set_title( CHAR_DATA *ch, const char *title );

/* skills.c */
void set_skill_level( CHAR_DATA *ch, int sn, int lvl );
void modify_skill_level( CHAR_DATA *ch, int sn, int value );
SKILLTYPE *create_skill( void );
int character_skill_level( const CHAR_DATA *ch, short skill );
bool check_skill( CHAR_DATA *ch, const char *command, char *argument );
void learn_from_success( CHAR_DATA *ch, int sn );
void learn_from_failure( CHAR_DATA *ch, int sn );
bool check_parry( CHAR_DATA *ch, CHAR_DATA *victim );
bool check_dodge( CHAR_DATA *ch, CHAR_DATA *victim );
bool check_grip( CHAR_DATA *ch, CHAR_DATA *victim );
void disarm( CHAR_DATA *ch, CHAR_DATA *victim );
void trip( CHAR_DATA *ch, CHAR_DATA *victim );

/* handler.c */
bool mobile_is_in_area( const AREA_DATA *area, long vnum );
OBJ_DATA *get_obj_type_char( const CHAR_DATA *ch, short item_type );
void character_extract_carried_objects( CHAR_DATA *ch );
void room_extract_mobiles( ROOM_INDEX_DATA *room );
void room_extract_contents( ROOM_INDEX_DATA *room );
void explode( OBJ_DATA *obj );
short get_trust( const CHAR_DATA *ch );
short get_age( const CHAR_DATA *ch );
short get_curr_str( const CHAR_DATA *ch );
short get_curr_int( const CHAR_DATA *ch );
short get_curr_wis( const CHAR_DATA *ch );
short get_curr_dex( const CHAR_DATA *ch );
short get_curr_con( const CHAR_DATA *ch );
short get_curr_cha( const CHAR_DATA *ch );
short get_curr_lck( const CHAR_DATA *ch );
short get_curr_frc( const CHAR_DATA *ch );
bool can_take_proto( const CHAR_DATA *ch );
int can_carry_n( const CHAR_DATA *ch );
int can_carry_w( const CHAR_DATA *ch );
void affect_modify( CHAR_DATA *ch, AFFECT_DATA *paf, bool fAdd );
void affect_to_char( CHAR_DATA *ch, AFFECT_DATA *paf );
void affect_remove( CHAR_DATA *ch, AFFECT_DATA *paf );
void affect_strip( CHAR_DATA *ch, int sn );
bool is_affected( const CHAR_DATA *ch, int sn );
void affect_join( CHAR_DATA *ch, AFFECT_DATA *paf );
void char_from_room( CHAR_DATA *ch );
void char_to_room( CHAR_DATA *ch, ROOM_INDEX_DATA *pRoomIndex );
OBJ_DATA * obj_to_char( OBJ_DATA *obj, CHAR_DATA *ch );
void obj_from_char( OBJ_DATA *obj );
int apply_ac( const OBJ_DATA *obj, int iWear );
OBJ_DATA *get_eq_char( const CHAR_DATA *ch, int iWear );
void equip_char( CHAR_DATA *ch, OBJ_DATA *obj, int iWear );
void unequip_char( CHAR_DATA *ch, OBJ_DATA *obj );
int count_obj_list( const OBJ_INDEX_DATA *obj, const OBJ_DATA *list );
void obj_from_room( OBJ_DATA *obj );
OBJ_DATA * obj_to_room( OBJ_DATA *obj, ROOM_INDEX_DATA *pRoomIndex );
OBJ_DATA * obj_to_obj( OBJ_DATA *obj, OBJ_DATA *obj_to );
void obj_from_obj( OBJ_DATA *obj );
void extract_obj( OBJ_DATA *obj );
void extract_exit( ROOM_INDEX_DATA *room, EXIT_DATA *pexit );
void extract_room( ROOM_INDEX_DATA *room );
void clean_room( ROOM_INDEX_DATA *room );
void clean_obj( OBJ_INDEX_DATA *obj );
void clean_mob( MOB_INDEX_DATA *mob );
void extract_char( CHAR_DATA *ch, bool fPull );
CHAR_DATA *get_char_room( const CHAR_DATA *ch, const char *argument );
CHAR_DATA *get_char_world( const CHAR_DATA *ch, const char *argument );
OBJ_DATA *get_obj_type( const OBJ_INDEX_DATA *pObjIndexData );
OBJ_DATA *get_obj_list( const CHAR_DATA *ch, const char *argument,
			OBJ_DATA *list );
OBJ_DATA *get_obj_list_rev( const CHAR_DATA *ch, const char *argument,
			    OBJ_DATA *list );
OBJ_DATA *get_obj_carry( const CHAR_DATA *ch, const char *argument );
OBJ_DATA *get_obj_wear( const CHAR_DATA *ch, const char *argument );
OBJ_DATA *get_obj_here( const CHAR_DATA *ch, const char *argument );
OBJ_DATA *get_obj_world( const CHAR_DATA *ch, const char *argument );
int get_obj_number( const OBJ_DATA *obj );
int get_obj_weight( const OBJ_DATA *obj );
bool room_is_dark( const ROOM_INDEX_DATA *pRoomIndex );
bool room_is_private( const CHAR_DATA *ch, const ROOM_INDEX_DATA *pRoomIndex );
bool can_see( const CHAR_DATA *ch, const CHAR_DATA *victim );
bool can_see_obj( const CHAR_DATA *ch, const OBJ_DATA *obj );
bool can_drop_obj( const CHAR_DATA *ch, const OBJ_DATA *obj );
const char *item_type_name( const OBJ_DATA *obj );
const char *affect_loc_name( int location );
char *affect_bit_name( int vector );
char *extra_bit_name( int extra_flags );
char *magic_bit_name( int magic_flags );
ch_ret check_for_trap( CHAR_DATA *ch, OBJ_DATA *obj, int flag );
ch_ret check_room_for_traps( CHAR_DATA *ch, int flag );
bool is_trapped( OBJ_DATA *obj );
OBJ_DATA *get_trap( OBJ_DATA *obj );
ch_ret spring_trap( CHAR_DATA *ch, OBJ_DATA *obj );
void fix_char( CHAR_DATA *ch );
void showaffect( const CHAR_DATA *ch, const AFFECT_DATA *paf );
void set_cur_obj( OBJ_DATA *obj );
bool obj_extracted( const OBJ_DATA *obj );
void queue_extracted_obj( OBJ_DATA *obj );
void clean_obj_queue( void );
void set_cur_char( CHAR_DATA *ch );
bool char_died( const CHAR_DATA *ch );
void queue_extracted_char( CHAR_DATA *ch, bool extract );
void clean_char_queue( void );
void add_timer( CHAR_DATA *ch, short type, short count,
		DO_FUN *fun, int value );
TIMER *get_timerptr( const CHAR_DATA *ch, short type );
short get_timer( const CHAR_DATA *ch, short type );
void extract_timer( CHAR_DATA *ch, TIMER *timer );
void remove_timer( CHAR_DATA *ch, short type );
bool luck_check( const CHAR_DATA *ch, short percent );
OBJ_DATA *clone_object( const OBJ_DATA *obj );
void split_obj( OBJ_DATA *obj, int num );
void separate_obj( OBJ_DATA *obj );
bool empty_obj( OBJ_DATA *obj, OBJ_DATA *destobj, ROOM_INDEX_DATA *destroom );
OBJ_DATA *find_obj( CHAR_DATA *ch, char *argument, bool carryonly );
bool ms_find_obj( const CHAR_DATA *ch );
void worsen_mental_state( CHAR_DATA *ch, int mod );
void better_mental_state( CHAR_DATA *ch, int mod );
void add_kill( CHAR_DATA *ch, CHAR_DATA *mob );
int times_killed( const CHAR_DATA *ch, const CHAR_DATA *mob );

/* interp.c */
void update_userec(struct timeval *time_used, struct timerset *userec);
bool check_pos( const CHAR_DATA *ch, short position );
void interpret( CHAR_DATA *ch, char *argument );
SOCIALTYPE * find_social( const char *command );
CMDTYPE *find_command( const char *command );
void hash_commands( void );
void send_timer( struct timerset *vtime, const CHAR_DATA *ch );

/* magic.c */
bool process_spell_components( CHAR_DATA *ch, int sn );
int ch_slookup( const CHAR_DATA *ch, const char *name );
int find_spell( const CHAR_DATA *ch, const char *name, bool know );
int find_skill( const CHAR_DATA *ch, const char *name, bool know );
int find_weapon( const CHAR_DATA *ch, const char *name, bool know );
int skill_lookup( const char *name );
int slot_lookup( int slot );
int bsearch_skill( const char *name, int first, int top );
int bsearch_skill_exact( const char *name, int first, int top );
bool saves_poison_death( int level, const CHAR_DATA *victim );
bool saves_wand( int level, const CHAR_DATA *victim );
bool saves_para_petri( int level, const CHAR_DATA *victim );
bool saves_breath( int level, const CHAR_DATA *victim );
bool saves_spell_staff( int level, const CHAR_DATA *victim );
ch_ret obj_cast_spell( int sn, int level, CHAR_DATA *ch,
		       CHAR_DATA *victim, OBJ_DATA *obj );
int dice_parse(const CHAR_DATA *ch, int level, char *expression);
SKILLTYPE *get_skilltype( int sn );

/* save.c */
/* object saving defines for fread/write_obj. -- Altrag */
#define OS_CARRY	0
#define OS_CORPSE	1
void save_char_obj( CHAR_DATA *ch );
void save_clone( CHAR_DATA *ch );
bool load_char_obj( DESCRIPTOR_DATA *d, const char *name, bool preload );
void set_alarm( long seconds );
void requip_char( CHAR_DATA *ch );
void fwrite_obj( const CHAR_DATA *ch,  const OBJ_DATA  *obj, FILE *fp, 
		 int iNest, short os_type );
void fread_obj( CHAR_DATA *ch,  FILE *fp, short os_type );
void de_equip_char( CHAR_DATA *ch );
void re_equip_char( CHAR_DATA *ch );
void save_home( const CHAR_DATA *ch );
void load_home( CHAR_DATA *ch );

/* shops.c */

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

/* tables.c */
int get_skill( const char *skilltype );
void load_skill_table( void );
void save_skill_table( void );
void sort_skill_table( void );
void load_socials( void );
void save_socials( void );
void load_commands( void );
void save_commands( void );
SPELL_FUN *spell_function( const char *name );
DO_FUN *skill_function( const char *name );

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

/* update.c */
void gain_condition( CHAR_DATA *ch, int iCond, int value );
void update_handler( void );
void reboot_check( time_t reset );
void auction_update( void );
void remove_portal( OBJ_DATA *portal );

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

void oprog_wear_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
bool oprog_use_trigger( CHAR_DATA *ch, OBJ_DATA *obj, 
                        CHAR_DATA *vict, OBJ_DATA *targ, void *vo );
char *oprog_type_to_name( int type );

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


/* mud prog defines */

#define ERROR_PROG        -1
#define IN_FILE_PROG       0
#define ACT_PROG           BV00
#define SPEECH_PROG        BV01
#define RAND_PROG          BV02
#define FIGHT_PROG         BV03
#define RFIGHT_PROG        BV03
#define DEATH_PROG         BV04
#define RDEATH_PROG        BV04
#define HITPRCNT_PROG      BV05
#define ENTRY_PROG         BV06
#define ENTER_PROG         BV06
#define GREET_PROG         BV07
#define RGREET_PROG	   BV07
#define OGREET_PROG        BV07
#define ALL_GREET_PROG	   BV08
#define GIVE_PROG	   BV09
#define BRIBE_PROG	   BV10
#define HOUR_PROG	   BV11
#define TIME_PROG	   BV12
#define WEAR_PROG          BV13  
#define REMOVE_PROG        BV14  
#define SAC_PROG           BV15  
#define LOOK_PROG          BV16  
#define EXA_PROG           BV17  
#define ZAP_PROG           BV18  
#define GET_PROG 	   BV19  
#define DROP_PROG	   BV20  
#define DAMAGE_PROG	   BV21  
#define REPAIR_PROG	   BV22  
#define RANDIW_PROG	   BV23  
#define SPEECHIW_PROG	   BV24  
#define PULL_PROG	   BV25  
#define PUSH_PROG	   BV26  
#define SLEEP_PROG         BV27  
#define REST_PROG          BV28  
#define LEAVE_PROG         BV29
#define SCRIPT_PROG	   BV30
#define USE_PROG           BV31

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

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

#define send_to_char  send_to_char_color
#define send_to_pager send_to_pager_color

/* Non-const string literals. See db.c */
extern char *STRLIT_EMPTY;
extern char *STRLIT_AUTO;
extern char *STRLIT_FULL;

/* skill_package.c */
typedef struct skill_package SKILL_PACKAGE;

struct skill_package
{
  const char *name;
  void (*builder_function)( CHAR_DATA *ch );
};

#ifdef __cplusplus
}
#endif

#endif /* include guard */