LOP/
LOP/area/
LOP/boards/
LOP/channels/
LOP/clans/
LOP/classes/
LOP/color/
LOP/councils/
LOP/deity/
LOP/races/
LOP/src/specials/
/*****************************************************************************
 * DikuMUD (C) 1990, 1991 by:                                                *
 *   Sebastian Hammer, Michael Seifert, Hans Henrik Staefeldt, Tom Madsen,   *
 *   and Katja Nyboe.                                                        *
 *---------------------------------------------------------------------------*
 * MERC 2.1 (C) 1992, 1993 by:                                               *
 *   Michael Chastain, Michael Quan, and Mitchell Tse.                       *
 *---------------------------------------------------------------------------*
 * SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by: Derek Snider.                    *
 *   Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, Swordbearer, *
 *         gorog, Grishnakh, Nivek, Tricops, and Fireblade.                  *
 *---------------------------------------------------------------------------*
 * SMAUG 1.7 FUSS by: Samson and others of the SMAUG community.              *
 *                    Their contributions are greatly appreciated.           *
 *---------------------------------------------------------------------------*
 * LoP (C) 2006, 2007, 2008 by: the LoP team.                                *
 *---------------------------------------------------------------------------*
 * Win32 port by Nick Gammon                                                 *
 *---------------------------------------------------------------------------*
 *                           Main mud header file                            *
 *****************************************************************************/

#include <stdlib.h>
#include <limits.h>
#if defined(__CYGWIN__) || defined(__FreeBSD__)
   #include <sys/time.h>
#endif
#include <typeinfo>

#ifdef WIN32
   #include <winsock.h>
   #include <sys/types.h>
   #pragma warning( disable: 4018 4244 4550 4761 )
   #define index strchr
   #define rindex strrchr
   #define vsnprintf _vsnprintf  /* NJG */
   #define snprintf _snprintf /* NJG */
   #define lstat stat   /* NJG */
   #pragma comment( lib, "ws2_32.lib" )   /* NJG */
   #pragma comment( lib, "winmm.lib" ) /* NJG */
#endif

typedef int ch_ret;
typedef int obj_ret;

#define NM extern "C"
#define DECLARE_DO_FUN( fun )    NM DO_FUN    fun
#define DECLARE_SPEC_FUN( fun )  NM SPEC_FUN  fun
#define DECLARE_SPELL_FUN( fun ) NM SPELL_FUN fun

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

#include "const.h"

/* Structure types. */
typedef struct affect_data AFFECT_DATA;
typedef struct area_data AREA_DATA;
typedef struct ban_data BAN_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 mob_index_data MOB_INDEX_DATA;
typedef struct char_morph CHAR_MORPH;
typedef struct morph_data MORPH_DATA;
typedef struct note_data NOTE_DATA;
typedef struct obj_data OBJ_DATA;
typedef struct obj_index_data OBJ_INDEX_DATA;
typedef struct pc_data PC_DATA;
typedef struct reset_data RESET_DATA;
typedef struct room_index_data ROOM_INDEX_DATA;
typedef struct shop_data SHOP_DATA;
typedef struct race_type RACE_TYPE;
typedef struct class_type CLASS_TYPE;
typedef struct repairshop_data REPAIR_DATA;
typedef struct weather_data WEATHER_DATA;
typedef struct neighbor_data NEIGHBOR_DATA;  /* FB */
typedef struct council_data COUNCIL_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 timer_data TIMER;
typedef struct system_data SYSTEM_DATA;
typedef struct smaug_affect SMAUG_AFF;
typedef struct skill_type SKILLTYPE;
typedef struct social_type SOCIALTYPE;
typedef struct cmd_type CMDTYPE;
typedef struct killed_data KILLED_DATA;
typedef struct ignore_data IGNORE_DATA;
typedef struct host_data HOST_DATA;
typedef struct extended_bitvector EXT_BV;
typedef struct lcnv_data LCNV_DATA;
typedef struct lang_data LANG_DATA;

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

#define DUR_CONV	23.333333333333333333333333
#define HIDDEN_TILDE	'*'

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

/* String and memory management parameters. */
#define MKH                2048
#define MAX_KEY_HASH        MKH
#define MSL                4096
#define MAX_STRING_LENGTH   MSL
#define MIL                1024
#define MAX_INPUT_LENGTH    MIL
#define MIS                1024
#define MAX_INBUF_SIZE      MIS
#define MLS                 252
#define MAX_LINE_SIZE       MLS
#define MFN                1024
#define MAX_FILE_NAME       MFN

#define HASHSTR   /* use string hashing */

#define MAX_NEST       20 /* maximum container nesting */

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

#define MAX_FIGHT           8

#define MAX_VNUM               100000 /* Game can hold up to 2 billion but this is set low for protection */
#define MAX_REXITS		   20 /* Maximum exits allowed in 1 room */
#define MAX_SKILL		  500
#define SPELL_SILENT_MARKER   "silent" /* No OK. or Failed. */
#define MAX_CLASS           	   50
#define MAX_RACE                   50

extern int MAX_PC_RACE;
extern int MAX_PC_CLASS;
extern bool mud_down;

#define MAX_CPD             4 /* Maximum council power level difference */
#define MAX_HERB           20
#define MAX_WHERE_NAME     40

#define MAX_LEVEL          100 /* Max Level of all players */
#define TIME_MODIFY          0 /* Done in seconds, Modifies current_time to what you want the time displayed in */
#define PERM_LOG           PERM_BUILDER

/* This is to tell if act uses uppercasestring or not --Shaddai */
extern bool DONT_UPPER;

#define	SECONDS_PER_TICK   70
#define PULSE_PER_SECOND    4
#define PULSE_VIOLENCE    ( 3 * PULSE_PER_SECOND )
#define PULSE_MOBILE      ( 4 * PULSE_PER_SECOND )
#define PULSE_ROOM        ( 2 * PULSE_PER_SECOND )
#define PULSE_TICK        ( SECONDS_PER_TICK * PULSE_PER_SECOND )
#define PULSE_AREA        ( 60 * PULSE_PER_SECOND )

/* SMAUG Version -- Scryn */
#define SMAUG_VERSION_MAJOR "1"
#define SMAUG_VERSION_MINOR "7 FUSS"
#define LOP_VERSION_MAJOR   "1"
#define LOP_VERSION_MINOR   "19"

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

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

/* short cut crash bug fix provided by gfinello@mail.karmanet.it*/
typedef enum
{
   relMSET_ON, relOSET_ON
} relation_type;

typedef struct rel_data REL_DATA;

struct rel_data
{
   void *Actor;
   void *Subject;
   REL_DATA *next;
   REL_DATA *prev;
   relation_type Type;
};

/*
 * 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,
   rSPELL_FAILED,  rVICT_IMMUNE = 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 extended bitvectors */
#ifndef INTBITS
   #define INTBITS      32
#endif
#define XBM             31  /* extended bitmask   ( INTBITS - 1 )  */
#define RSV              5  /* right-shift value  ( sqrt(XBM+1) )  */
#define XBI              4  /* integers in an extended bitvector   */
#define MAX_BITS        XBI * INTBITS

/* Structure for extended bitvectors -- Thoric */
struct extended_bitvector
{
   int bits[XBI];
};

#include "color.h"
#include "hotboot.h"
#ifdef IMC
   #include "imc.h"
#endif

/* Structure for a morph -- Shaddai Morph structs. */
struct char_morph
{
   MORPH_DATA *morph;
   EXT_BV affected_by, no_affected_by;
   EXT_BV immune, no_immune;
   EXT_BV resistant, no_resistant;
   EXT_BV suscept, no_suscept;
   int timer;             /* How much time is left */
   short ac;
   short blood;
   short stats[STAT_MAX];
   short damroll;
   short dodge;
   short hit;
   short hitroll;
   short mana;
   short move;
   short parry;
   short saving_breath;
   short saving_para_petri;
   short saving_poison_death;
   short saving_spell_staff;
   short saving_wand;
   short tumble;
};

struct morph_data
{
   MORPH_DATA *next, *prev;
   EXT_BV affected_by, no_affected_by;
   EXT_BV immune, no_immune;
   EXT_BV resistant, no_resistant;
   EXT_BV suscept, no_suscept;
   EXT_BV Class;              /* Classes not allowed to use this */
   EXT_BV race;               /* Races not allowed to use this */
   char *blood;               /* Blood added vamps only */
   char *damroll;
   char *deity;
   char *description;
   char *help;                /* What player sees for info on morph */
   char *hit;                 /* Hitpoints added */
   char *hitroll;
   char *key_words;           /* Keywords added to your name */
   char *long_desc;           /* New long_desc for player */
   char *mana;                /* Mana added not for vamps */
   char *morph_other;         /* What others see when you morph */
   char *morph_self;          /* What you see when you morph */
   char *move;                /* Move added */
   char *name;                /* Name used to polymorph into this */
   char *short_desc;          /* New short desc for player */
   char *no_skills;           /* Prevented Skills */
   char *skills;
   char *unmorph_other;       /* What others see when you unmorph */
   char *unmorph_self;        /* What you see when you unmorph */
   int defpos;                /* Default position */
   int timer;                 /* Timer for how long it lasts */
   int obj[3];                /* Object needed to morph you */
   int used;                  /* How many times has this morph been used */
   int vnum;                  /* Unique identifier */
   int level;                 /* Minimum level to use this morph */
   short ac;
   short bloodused;           /* Amount of blood morph requires Vamps only */
   short stats[STAT_MAX];
   short dayfrom;             /* Starting Day you can morph into this */
   short dayto;               /* Ending Day you can morph into this */
   short dodge;               /* Percent of dodge added IE 1 = 1% */
   short favourused;          /* Amount of favour to morph */
   short gloryused;           /* Amount of glory used to morph */
   short hpused;              /* Amount of hps used to morph */
   short manaused;            /* Amount of mana used to morph */
   short moveused;            /* Amount of move used to morph */
   short parry;               /* Percent of parry added IE 1 = 1% */
   short pkill;               /* Pkill Only, Peacefull Only or Both */
   short saving_breath;       /* Below are saving adjusted */
   short saving_para_petri;
   short saving_poison_death;
   short saving_spell_staff;
   short saving_wand;
   short sex;                 /* The sex that can morph into this */
   short timefrom;            /* Hour starting you can morph */
   short timeto;              /* Hour ending that you can morph */
   short tumble;              /* Percent of tumble added IE 1 = 1% */
   bool no_cast;              /* Can you cast a spell to morph into it */
   bool objuse[3];            /* Objects needed to morph */
};

/* Tongues / Languages structures */
struct lcnv_data
{
   LCNV_DATA *next, *prev;
   char *old;
   char *lnew;
   int olen;
   int nlen;
};

struct lang_data
{
   LANG_DATA *next, *prev;
   LCNV_DATA *first_precnv, *last_precnv;
   LCNV_DATA *first_cnv, *last_cnv;
   char *name;
   char *alphabet;
};

/* Ban Types --- Shaddai */
#define BAN_WARN  -1
#define BAN_SITE   1
#define BAN_CLASS  2
#define BAN_RACE   3

/* Site ban structure. */
struct ban_data
{
   BAN_DATA *next, *prev;
   char *name;         /* Name of site/class/race banned */
   char *note;         /* Why it was banned */
   char *ban_by;       /* Who banned this site */
   char *ban_time;     /* Time it was banned */
   int flag;           /* Class or Race number */
   int unban_date;     /* When ban expires */
   int level;
   short duration;     /* How long it is banned for */
   bool warn;          /* Echo on warn channel */
   bool prefix;        /* Use of *site */
   bool suffix;        /* Use of site* */
};

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

typedef struct hour_min_sec HOUR_MIN_SEC;
struct hour_min_sec
{
   int hour;
   int min;
   int sec;
   int manual;
};
extern HOUR_MIN_SEC *set_boot_time;

typedef struct time_info_data TIME_INFO_DATA;
struct time_info_data
{
   short hour;
   short day;
   short wday;
   short month;
   short sunlight;
   int year;
};
extern TIME_INFO_DATA time_info;

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

struct weather_data
{
   NEIGHBOR_DATA *first_neighbor, *last_neighbor;
   char *echo;
   int echo_color;
   short   temp,   temp_vector,   climate_temp;
   short precip, precip_vector, climate_precip;
   short   wind,   wind_vector,   climate_wind;
};

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

struct host_data
{
   HOST_DATA *next, *prev;
   char *host;
   bool prefix, suffix;
};

/* Connected state for a channel. */
typedef enum
{
   CON_GET_NAME = -99,    CON_GET_OLD_PASSWORD,      CON_CONFIRM_NEW_NAME,
   CON_GET_NEW_PASSWORD,  CON_CONFIRM_NEW_PASSWORD,  CON_GET_NEW_SEX,
   CON_READ_MOTD,         CON_GET_NEW_RACE,          CON_GET_NEW_CLASS,
   CON_GET_WANT_ANSI,     CON_PRESS_ENTER,           CON_COPYOVER_RECOVER,
   CON_GET_PKILL,         CON_PLAYING = 0,           CON_EDITING
} connection_types;

char *con_state( short state );

/* Character substates */
typedef enum
{
   SUB_NONE,         SUB_PAUSE,      SUB_PERSONAL_DESC, SUB_BAN_DESC,
   SUB_OBJ_SHORT,    SUB_OBJ_LONG,   SUB_OBJ_EXTRA,     SUB_MOB_LONG,
   SUB_MOB_DESC,     SUB_ROOM_DESC,  SUB_ROOM_EXTRA,    SUB_ROOM_EXIT_DESC,
   SUB_WRITING_NOTE, SUB_MPROG_EDIT, SUB_HELP_EDIT,     SUB_PERSONAL_BIO,
   SUB_REPEATCMD,    SUB_RESTRICTED, SUB_DEITYDESC,     SUB_MORPH_DESC,
   SUB_MORPH_HELP,   SUB_PROJ_DESC,  SUB_MAP_EDIT,      SUB_EDITING_NOTE,
   /* 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, *prev, *snoop_by;
   CHAR_DATA *character;
   struct mccp_data *mccp; /* Mud Client Compression Protocol */
   unsigned char prevcolor;
   char *host;
   char inbuf[MIS];
   char incomm[MIL];
   char inlast[MIL];
   char *outbuf;
   char *pagebuf;
   char *pagepoint;
   char pagecmd;
   char pagecolor;
   unsigned long outsize;
   unsigned long pagesize;
   time_t outtime;
   int repeat;
   int port;
   int pagetop;
   int descriptor;
   int outtop;
   int newstate;
   short connected;
   short idle;
   short tempidle;
   short lines;
   short scrlen;
   short speed;
   bool fcommand;
   bool can_compress;
};

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

#define INIT_WEAPON_CONDITION    12
#define MAX_ITEM_IMPACT		 30

/* Shop types. */
struct shop_data
{
   SHOP_DATA *next, *prev;
   int keeper;
   short profit_buy;
   short profit_sell;
   short open_hour;
   short close_hour;
   bool buy_type[ITEM_TYPE_MAX];
};

struct repairshop_data
{
   REPAIR_DATA *next, *prev;
   int keeper;
   short profit_fix;
   short open_hour;
   short close_hour;
   bool fix_type[ITEM_TYPE_MAX];
};

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

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

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

extern bool MOBtrigger;

/* Per-class stuff. */
struct class_type
{
   char *name;        /* Name for 'who' */
   short clistplace;  /* Where its at in the class list currently */
};

/* race dedicated stuff */
struct race_type
{
   EXT_BV affected;                  /* Default affect bitvectors */
   EXT_BV resist;
   EXT_BV suscept;
   EXT_BV class_restriction;
   char *name;                       /* Race name */
   char *where_name[MAX_WHERE_NAME];
   int language;                     /* Default racial language */
   short base_stats[STAT_MAX];       /* Starting stats */
   short max_stats[STAT_MAX];        /* Maximum stats */
   short hit;
   short mana;                       /* None/Mana/Blood */
   short move;
   short ac_plus;
   short minalign, alignment, maxalign;
   short minheight, maxheight;
   short minweight, maxweight;
   short hunger_mod;
   short thirst_mod;
   short race_recall;
   short rlistplace;                 /* Where its at in the race list currently */
   short uses;                       /* 0 = Nothing, 1 = Mana, 2 = Blood */
};

typedef struct member_data MEMBER_DATA;
struct member_data
{
   MEMBER_DATA *next, *prev;
   char *name;
};

typedef enum
{
   CLAN_PLAIN, CLAN_NATION
} clan_types;

typedef struct clan_data CLAN_DATA;
struct clan_data
{
   CLAN_DATA *next, *prev;
   MEMBER_DATA *first_member, *last_member;
   char *filename;    /* Clan filename */
   char *name;        /* Clan name */
   char *motto;       /* Clan motto */
   char *description; /* A brief description of the clan */
   char *leader;      /* Head clan leader */
   char *number1;     /* First officer */
   char *number2;     /* Second officer */
   char *badge;       /* Clan badge on who/where/to_room */
   char *leadrank;    /* Leader's rank */
   char *onerank;     /* Number One's rank */
   char *tworank;     /* Number Two's rank */
   int recall;        /* Vnum of clan's recall room */
   int storeroom;     /* Vnum of clan's store room */
   int race;          /* For Nations */
   short clan_type;   /* See clan type defines */
   short members;     /* Number of clan members */
};

struct council_data
{
   COUNCIL_DATA *next, *prev;
   MEMBER_DATA *first_member, *last_member;
   char *filename;    /* Council filename */
   char *name;        /* Council name */
   char *description; /* A brief description of the council */
   char *head;        /* Council head */
   char *head2;       /* Council co-head */
   char *powers;      /* Council powers */
   short members;     /* Number of council members */
};

typedef struct deity_data DEITY_DATA;
struct deity_data
{
   DEITY_DATA *next, *prev;
   MEMBER_DATA *first_worshipper, *last_worshipper;
   EXT_BV suscept;
   EXT_BV resist;
   EXT_BV affected;
   EXT_BV Class;            /* Classes allowed to use this */
   EXT_BV race;             /* Races allowed to use this */
   char *filename;
   char *name;
   char *description;
   int sex;
   int susceptnum;
   int resistnum;
   int affectednum;
   int objvnum;
   int mobvnum;
   short alignment;
   short worshippers;
   short sdeityobj;
   short savatar;
   short scorpse;
   short srecall;
   short flee;
   short kill;
   short kill_magic;
   short sac;
   short bury_corpse;
   short aid_spell;
   short aid;
   short spell_aid;
   short backstab;
   short steal;
   short die;
   short dig_corpse;
};
DEITY_DATA *get_deity( char *name );
void adjust_favor( CHAR_DATA *ch, int field, int mod );

typedef struct vote_data VOTE_DATA;
struct vote_data
{
   VOTE_DATA *next, *prev;
   char *name;
   short vote;
};

typedef struct bid_data BID_DATA;
struct bid_data
{
   BID_DATA *next, *prev;
   char *name;
   int bid;
};

typedef struct read_data READ_DATA;
struct read_data
{
   READ_DATA *next, *prev;
   char *name;
};

/* Data structure for notes. */
struct note_data
{
   NOTE_DATA *next, *prev;
   VOTE_DATA *first_vote, *last_vote;
   BID_DATA *first_bid, *last_bid;  /* Used for auctions */
   READ_DATA *first_read, *last_read;
   OBJ_DATA *obj;   /* Used for auctions */
   char *sender;
   char *to_list;
   char *subject;
   char *text;
   time_t posttime;
   int voting;
   int yesvotes;
   int novotes;
   int abstentions;
   int autowin;     /* Used for auctions */
   int sfor;        /* Used for auctions */
   bool aclosed;    /* Used for auctions */
   bool acanceled;  /* Used for auctions */
};

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

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

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

/* Well known mob virtual numbers. Defined in #MOBILES. */
/*  1-2  Used by other stuff */
#define MOB_VNUM_SUPERMOB            3
/*  4    unused */
#define MOB_VNUM_ANIMATED_CORPSE     5
/*  6-79 unused */
#define MOB_VNUM_VAMPIRE	    80
#define MOB_VNUM_CITYGUARD	    81
/* 82-99 unused */

/* Pipe flags */
#define PIPE_LIT        BV00
#define PIPE_GOINGOUT   BV01
#define PIPE_FULLOFASH  BV02

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

/* Well known object virtual numbers. */
/*  1    Unused */
#define OBJ_VNUM_MONEY_ONE            2
#define OBJ_VNUM_MONEY_SOME           3
/*  4-9  Unused */
#define OBJ_VNUM_CORPSE_NPC          10
#define OBJ_VNUM_CORPSE_PC           11
#define OBJ_VNUM_SEVERED_HEAD        12
#define OBJ_VNUM_TORN_HEART          13
#define OBJ_VNUM_SLICED_ARM          14
#define OBJ_VNUM_SLICED_LEG          15
#define OBJ_VNUM_SPILLED_GUTS        16
#define OBJ_VNUM_BLOOD               17
#define OBJ_VNUM_BLOODSTAIN          18
#define OBJ_VNUM_SCRAPS              19
#define OBJ_VNUM_MUSHROOM            20
#define OBJ_VNUM_LIGHT_BALL          21
#define OBJ_VNUM_SPRING              22
#define OBJ_VNUM_SKIN                23
#define OBJ_VNUM_SLICE               24
#define OBJ_VNUM_SHOPPING_BAG        25
#define OBJ_VNUM_BLOODLET            26
/* 27-29 Unused */
#define OBJ_VNUM_FIRE                30
#define OBJ_VNUM_TRAP                31
#define OBJ_VNUM_PORTAL              32
#define OBJ_VNUM_BLACK_POWDER        33
/* 34-35 Unused */
#define OBJ_VNUM_WOOD                36
/* 37-38 Unused */
#define OBJ_VNUM_WOODFIRE            39
/* 40-43 Unused */
/* 44-59 Used for bodyparts */
/* 60    Used for blood fountain */
/* 61-62 Unused */
/* 63    Used by 'extradimensional portal' */
/* 64-79 Unused */
/* 80-87 Used for bodyparts */
/* 88-90 Unused */
#define OBJ_VNUM_MAP                 91
/* 92-94 Unused */
#define OBJ_VNUM_FISH                95
/* 96    Unused */
#define OBJ_VNUM_LOCKER              97
/* 98-99 Unused */

/* Lever/dial/switch/button/pullchain flags */
#define TRIG_UP           BV00
#define TRIG_UNLOCK       BV01
#define TRIG_LOCK         BV02
#define TRIG_D_NORTH      BV03
#define TRIG_D_SOUTH      BV04
#define TRIG_D_EAST       BV05
#define TRIG_D_WEST       BV06
#define TRIG_D_UP         BV07
#define TRIG_D_DOWN       BV08
#define TRIG_D_NORTHEAST  BV09
#define TRIG_D_NORTHWEST  BV10
#define TRIG_D_SOUTHEAST  BV11
#define TRIG_D_SOUTHWEST  BV12
#define TRIG_D_SOMEWHERE  BV13
#define TRIG_DOOR         BV14
#define TRIG_CONTAINER    BV15
#define TRIG_OPEN         BV16
#define TRIG_CLOSE        BV17
#define TRIG_PASSAGE      BV18
#define TRIG_OLOAD        BV19
#define TRIG_MLOAD        BV20
#define TRIG_TELEPORT     BV21
#define TRIG_TELEPORTALL  BV22
#define TRIG_TELEPORTPLUS BV23
#define TRIG_DEATH        BV24
#define TRIG_CAST         BV25
#define TRIG_RAND4        BV26
#define TRIG_RAND6        BV27
#define TRIG_RAND10       BV28
#define TRIG_RAND11       BV29
#define TRIG_SHOWROOMDESC BV30
#define TRIG_AUTORETURN   BV31

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

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

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

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

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

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

/* Auth Flags */
#define FLAG_WRAUTH 1
#define FLAG_AUTH   2

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

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

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

/*
 * Prototype for a mob.
 * This is the in-memory version of #MOBILES.
 */
struct mob_index_data
{
   MOB_INDEX_DATA *next;
   MOB_INDEX_DATA *next_sort;
   SPEC_FUN *spec_fun;
   SHOP_DATA *pShop;
   REPAIR_DATA *rShop;
   MPROG_DATA *mudprogs;
   EXT_BV progtypes;
   EXT_BV act;
   EXT_BV affected_by;
   EXT_BV xflags;
   EXT_BV immune;
   EXT_BV resistant;
   EXT_BV susceptible;
   EXT_BV attacks;
   EXT_BV defenses;
   EXT_BV speaks, speaking;
   char *name;
   char *short_descr;
   char *long_descr;
   char *description;
   char *spec_funname;
   int vnum;
   int gold;
   int mgold;
   short sex;
   short alignment;
   short ac;
   short numattacks;
   short position;
   short defposition;
   short perm_stats[STAT_MAX];
   short saving_poison_death;
   short saving_wand;
   short saving_para_petri;
   short saving_breath;
   short saving_spell_staff;
   short minhit;
   short maxhit;
   short height;
   short weight;
   short hitroll;
   short damroll;
   short count;
   short killed;
   int level;
};

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][( MLS + 2 )];
};

typedef struct extracted_char_data EXTRACT_CHAR_DATA;
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, *prev;
   CHAR_DATA *next_in_room, *prev_in_room;
   CHAR_DATA *master, *leader;
   CHAR_DATA *next_pet, *prev_pet;
   CHAR_DATA *reply, *retell;
   CHAR_DATA *mount;
   CHAR_DATA *editing;
   HOST_DATA *first_host, *last_host;
   OBJ_DATA *first_carrying, *last_carrying;
   ROOM_INDEX_DATA *in_room, *was_in_room;
   PC_DATA *pcdata;
   DO_FUN *last_cmd, *prev_cmd;
   TIMER *first_timer, *last_timer;
   NOTE_DATA *pnote;
   DESCRIPTOR_DATA *desc;
   AFFECT_DATA *first_affect, *last_affect;
   MOB_INDEX_DATA *pIndexData;
   FIGHT_DATA *fighting;
   MPROG_ACT_LIST *mpact;
   EDITOR_DATA *editor;
   CHAR_MORPH *morph;
   HHF_DATA *hunting, *fearing, *hating;
   SPEC_FUN *spec_fun;
   EXT_BV xflags;
   EXT_BV act;
   EXT_BV affected_by, no_affected_by;
   EXT_BV immune, no_immune;
   EXT_BV resistant, no_resistant;
   EXT_BV susceptible, no_susceptible;
   EXT_BV attacks;
   EXT_BV defenses;
   EXT_BV deaf;
   EXT_BV speaks, speaking;
   void *dest_buf;
   void *spare_ptr;
   char *spec_funname;
   char *alloc_ptr;
   char *name;
   char *short_descr;
   char *long_descr;
   char *description;
   time_t logon;
   time_t save_time;
   double exp;
   int mpactnum;
   int tempnum;
   int temp_played, played;
   int questcountdown;
   int questvnum;
   int questtype;
   int questgiver;
   int gold;
   int mgold;
   int carry_weight;
   int carry_number;
   int retran;
   int regoto;
   int resetvnum; /* reset tracker - room vnum */
   int resetnum;  /* reset tracker - reset # */
   int hit, max_hit;
   int mana, max_mana;
   int move, max_move;
   int level;
   unsigned short mpscriptpos;
   short num_fighting;
   short substate;
   short sex;
   short Class;
   short race;
   short trust;
   short timer;
   short wait;
   short practice;
   short numattacks;
   short saving_poison_death;
   short saving_wand;
   short saving_para_petri;
   short saving_breath;
   short saving_spell_staff;
   short alignment;
   short hitroll;
   short damroll;
   short position, defposition;
   short style;
   short height;
   short weight;
   short armor;
   short wimpy;
   short perm_stats[STAT_MAX];
   short mental_state;  /* simplified */
   short mobinvis;   /* Mobinvis level SB */
   short colors[MAX_COLORS];
};

struct killed_data
{
   int vnum;
   char count;
};

/* Structure for link list of ignored players */
struct ignore_data
{
   IGNORE_DATA *next, *prev;
   char *name;
};

typedef struct per_history PER_HISTORY;
struct per_history
{
   PER_HISTORY *next, *prev;
   char *text;
   time_t chtime;
};

/* Data which only PC's have. */
struct pc_data
{
   CHAR_DATA *first_pet, *last_pet;
   NOTE_DATA *gnote;
   CLAN_DATA *clan;
   CLAN_DATA *nation;
   COUNCIL_DATA *council;
   AREA_DATA *area;
   DEITY_DATA *deity;
   KILLED_DATA killed[MAX_KILLTRACK];
   IGNORE_DATA *first_ignored, *last_ignored; /* keep track of who to ignore */
   PER_HISTORY *first_tell, *last_tell;
   PER_HISTORY *first_whisper, *last_whisper;
   PER_HISTORY *first_yell, *last_yell;
   PER_HISTORY *first_say, *last_say;
#ifdef IMC
   IMC_CHARDATA *imcchardata;
#endif
   EXT_BV flags;                 /* Whether the player is deadly and whatever else we add.      */
   char *channels;
   char *spouse;
   char *homepage;
   char *email;
   char *msn;
   char *yahoo;
   char *gtalk;
   char *pwd;
   char *bamfin;
   char *bamfout;
   char *filename;               /* For the safe mset name -Shaddai */
   char *rank;
   char *title;
   char *bestowments;            /* Special bestowed commands     */
   char *bio;                    /* Personal Bio */
   char *authed_by;              /* what crazy imm authed this name ;) */
   char *prompt;                 /* User config prompts */
   char *fprompt;                /* Fight prompts */
   char *subprompt;              /* Substate prompt */
   char sudoku[9][9], dis_sudoku[9][9]; /* for the sudoku puzzles */
   time_t news_read;
   time_t restore_time;          /* The last time the char did a restore all */
   time_t sstarttime, sfastesttime, sslowesttime, slasttime;
   unsigned swins, squits;
   unsigned int pkills;          /* Number of pkills */
   unsigned int pdeaths;         /* Number of times pkilled (legally)  */
   unsigned int mkills;          /* Number of mobs killed */
   unsigned int mdeaths;         /* Number of deaths due to mobs */
   int quest_curr;               /* current number of quest points */
   int range_lo, range_hi;       /* vnum range */
   int auth_state;
   int birth_year;
   int wizinvis;                 /* wizinvis level */
   int min_snoop;                /* minimum snoop level */
   int onboard;
   short speed;
   short condition[MAX_CONDS];
   short learned[MAX_SKILL];
   short favor;                  /* deity favor */
   short charmies;               /* Number of Charmies */
   short pagerlen;               /* For pager length */
   short kltime;                 /* For the keep alive timer */
   short birth_month;
   short birth_day;
   bool hotboot;                 /* hotboot tracker */
   bool logged;                  /* are they logged? */
};

/* Liquids. */
#define LIQ_WATER   1
#define LIQ_BLOOD  14
#define LIQ_MAX    19

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

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

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

/* Prototype for an object. */
struct obj_index_data
{
   OBJ_INDEX_DATA *next, *next_sort;
   EXTRA_DESCR_DATA *first_extradesc, *last_extradesc;
   AFFECT_DATA *first_affect, *last_affect;
   MPROG_DATA *mudprogs;   /* objprogs */
   EXT_BV progtypes; /* objprogs */
   EXT_BV extra_flags;
   EXT_BV wear_flags;
   EXT_BV class_restrict; /* Classes that can't wear it */
   EXT_BV race_restrict;  /* Races that can't wear it */
   char *name;
   char *short_descr;
   char *description;
   char *action_desc;
   int vnum;
   int cost;
   int value[6];
   int level;
   short stat_reqs[STAT_MAX];
   short item_type;
   short count;
   short weight;
   short layers;
};

/* One object. */
struct obj_data
{
   OBJ_DATA *next, *prev;
   OBJ_DATA *next_corpse, *prev_corpse;
   OBJ_DATA *next_content, *prev_content;
   OBJ_DATA *first_content, *last_content;
   OBJ_DATA *in_obj;
   CHAR_DATA *carried_by;
   EXTRA_DESCR_DATA *first_extradesc, *last_extradesc;
   AFFECT_DATA *first_affect, *last_affect;
   OBJ_INDEX_DATA *pIndexData;
   ROOM_INDEX_DATA *in_room;
   EXT_BV extra_flags;
   EXT_BV wear_flags;
   EXT_BV class_restrict; /* Classes that can't wear it */
   EXT_BV race_restrict;  /* Races that can't wear it */
   MPROG_ACT_LIST *mpact;  /* mudprogs */
   char *name;
   char *short_descr;
   char *description;
   char *action_desc;
   char *owner;
   int mpactnum;  /* mudprogs */
   int cost;
   int value[6];
   int room_vnum; /* hotboot tracker */
   int level;
   short timer;
   short count;   /* support for object grouping */
   short wear_loc;
   short t_wear_loc; /* temp wear loc used for saving objects wear loc */
   short weight;
   short stat_reqs[STAT_MAX];
   short item_type;
   short mpscriptpos;
};

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

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

/* Area-reset definition. */
struct reset_data
{
   RESET_DATA *next, *prev;
   RESET_DATA *first_reset, *last_reset;
   RESET_DATA *next_reset, *prev_reset;
   char command;
   int extra;
   int arg1;
   int arg2;
   int arg3;
   short rchance; /* 1-100% chance of it reseting */
   bool doreset; /* Should this reset? */
};

/* Area flags */
typedef enum
{
   AREA_DELETED, AREA_LOADED
} area_flag;

/* Area definition. */
struct area_data
{
   AREA_DATA *next, *prev;
   AREA_DATA *next_sort, *prev_sort;
   AREA_DATA *next_sort_name, *prev_sort_name;
   ROOM_INDEX_DATA *first_room, *last_room;
   WEATHER_DATA *weather;
   EXT_BV flags;
   char *name;
   char *filename;
   char *author;  /* Scryn */
   char *resetmsg;   /* Rennard */
   int low_vnum, hi_vnum;
   int low_soft_range, hi_soft_range;
   int low_hard_range, hi_hard_range;
   short status;
   short age;
   short nplayer;
   short reset_frequency;
   short max_players;
};

/* Used to keep track of system settings and statistics -Thoric */
struct system_data
{
   EXT_BV save_flags;            /* Toggles for saving conditions */
   void *dlHandle;
   char *mud_name;               /* Name of mud */
   time_t time_of_max;           /* Time of max ever */
   time_t next_pfile_cleanup;    /* Time of next pfile cleaning */
   int maxplayers;               /* Maximum players this boot */
   int alltimemax;               /* Maximum players ever */
   int room_limbo;
   int room_poly;
   int room_authstart;
   int room_deadly;
   int room_school;
   int room_temple;
   int room_altar;
   int room_halloffallen;
   short perm_muse;              /* Permission of muse channel */
   short perm_think;             /* Permission of think channel */
   short perm_build;             /* Permission of build channel */
   short perm_log;               /* Permission of log channel */
   short perm_modify_proto;      /* Permission to modify prototype stuff */
   short perm_override_private;  /* override private flag */
   short perm_mset_player;       /* Permission to mset a player */
   short perm_getobjnotake;      /* Get objects without take flag */
   short perm_forcepc;           /* The permission at which you can use force on players. */
   short bestow_dif;             /* Max # of levels between trust and command level for a bestow to work --Blodkai */
   short save_frequency;         /* How old to autosave someone */
   short ban_site, ban_class, ban_race; /* Levels to ban sites/classes/races */
   short ident_retries;          /* Number of times to retry broken pipes. */
   short mlimit_total;           /* Max Limit for total connections from 1 host */
   short mlimit_deadly;          /* Max Limit for deadly characters from 1 host */
   short mlimit_peaceful;        /* Max Limit for peaceful characters from 1 host */
   short maxpet;                 /* Max number of pets for each character */
   bool NAME_RESOLVING;          /* Hostnames get resolved */
   bool DENY_NEW_PLAYERS;        /* New players can't connect */
   bool WAIT_FOR_AUTH;           /* New players must be auth'ed */
   bool save_pets;               /* Do pets save? */
   bool morph_opt;               /* Do we optimize morph's? */
   bool pk_loot;                 /* Pkill looting allowed? */
   bool wizlock;                 /* Game is wizlocked */
   bool skipclasses;             /* Skip picking classes on character creation */
};

/* Room type. */
struct room_index_data
{
   ROOM_INDEX_DATA *next, *next_sort;
   ROOM_INDEX_DATA *next_aroom, *prev_aroom;
   RESET_DATA *first_reset, *last_reset;
   RESET_DATA *last_mob_reset;
   RESET_DATA *last_obj_reset;
   CHAR_DATA *first_person, *last_person;
   OBJ_DATA *first_content, *last_content;
   EXTRA_DESCR_DATA *first_extradesc, *last_extradesc;
   AREA_DATA *area;
   EXIT_DATA *first_exit, *last_exit;
   MPROG_ACT_LIST *mpact;  /* mudprogs */
   EXT_BV room_flags;
   EXT_BV progtypes; /* mudprogs */
   MPROG_DATA *mudprogs;   /* mudprogs */
   char *name;
   char *description;
   int mpactnum;  /* mudprogs */
   int sector_type;
   int tele_vnum;
   int vnum;
   short mpscriptpos;
   short light;   /* amount of light in the room */
   short tele_delay;
   short tunnel;  /* max people that will fit */
};

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

typedef enum
{
   SKILL_UNKNOWN,  SKILL_SPELL,   SKILL_SKILL,   SKILL_WEAPON,  SKILL_TONGUE,
   SKILL_HERB
} 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
{
   EXT_BV flags;
   EXT_BV spell_sector;          /* Sector Spell work */
   SMAUG_AFF *first_affect, *last_affect;
   SPELL_FUN *spell_fun;         /* Spell pointer (for spells) */
   char *spell_fun_name;         /* Spell function name - Trax */
   DO_FUN *skill_fun;            /* Skill pointer (for skills) */
   char *skill_fun_name;         /* Skill function name - Trax */
   char *name;
   char *noun_damage;            /* Damage message */
   char *msg_off;                /* Wear off message */
   char *hit_char;               /* Success message to caster */
   char *hit_vict;               /* Success message to victim */
   char *hit_room;               /* Success message to room */
   char *hit_dest;               /* Success message to dest room */
   char *miss_char;              /* Failure message to caster */
   char *miss_vict;              /* Failure message to victim */
   char *miss_room;              /* Failure message to room */
   char *die_char;               /* Victim death msg to caster */
   char *die_vict;               /* Victim death msg to victim */
   char *die_room;               /* Victim death msg to room */
   char *imm_char;               /* Victim immune msg to caster */
   char *imm_vict;               /* Victim immune msg to victim */
   char *imm_room;               /* Victim immune msg to room */
   char *dice;                   /* Dice roll */
   char *components;             /* Spell components, if any */
   char *teachers;               /* Skill requires a special teacher */
   int value;                    /* Misc value */
   short participants;           /* # of required participants */
   short saves;                  /* What saving spell applies */
   short difficulty;             /* Difficulty of casting/learning */
   int min_level;                /* Minimum level to be able to cast */
   short type;                   /* Spell/Skill/Weapon/Tongue */
   short range;                  /* Range of spell (rooms) */
   short damage;
   short Class;
   short action;
   short power;
   short save;
   int skill_level[MAX_CLASS];
   short skill_adept[MAX_CLASS];
   int race_level[MAX_RACE];
   short race_adept[MAX_RACE];
   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 */
   short tempsn;                 /* For when resorting skill table */
   struct timerset userec;       /* Usage record */
};

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

/* These are skill_lookup return values for common skills and spells. */
extern short gsn_style_evasive;
extern short gsn_style_defensive;
extern short gsn_style_standard;
extern short gsn_style_aggressive;
extern short gsn_style_berserk;

extern short gsn_detrap;
extern short gsn_backstab;
extern short gsn_circle;
extern short gsn_cook;
extern short gsn_dodge;
extern short gsn_duck;
extern short gsn_block;
extern short gsn_shieldblock;
extern short gsn_counter;
extern short gsn_hide;
extern short gsn_peek;
extern short gsn_pick_lock;
extern short gsn_scan;
extern short gsn_sneak;
extern short gsn_steal;
extern short gsn_gouge;
extern short gsn_track;
extern short gsn_search;
extern short gsn_dig;
extern short gsn_mount;
extern short gsn_bashdoor;
extern short gsn_berserk;

extern short gsn_disarm;
extern short gsn_enhanced_damage;
extern short gsn_kick;
extern short gsn_parry;
extern short gsn_rescue;

extern short gsn_feed;
extern short gsn_chop;
extern short gsn_makefire;
extern short gsn_bloodlet;

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_first_tongue;
extern short gsn_top_sn;

/* spells */
extern short gsn_blindness;
extern short gsn_charm_person;
extern short gsn_aqua_breath;
extern short gsn_curse;
extern short gsn_invis;
extern short gsn_poison;
extern short gsn_sleep;

/* newer attack skills */
extern short gsn_punch;
extern short gsn_bash;
extern short gsn_stun;
extern short gsn_bite;
extern short gsn_claw;
extern short gsn_tail;

extern short gsn_poison_weapon;
extern short gsn_scribe;
extern short gsn_brew;
extern short gsn_imbue;
extern short gsn_carve;
extern short gsn_concoct;
extern short gsn_mix;
extern short gsn_climb;

extern short gsn_barehanded;
extern short gsn_pugilism;
extern short gsn_long_blades;
extern short gsn_short_blades;
extern short gsn_flexible_arms;
extern short gsn_talonous_arms;
extern short gsn_bludgeons;
extern short gsn_missile_weapons;

extern short gsn_grip;
extern short gsn_slice;

extern short gsn_tumble;

/* Language gsns. -- Altrag */
extern short gsn_common;

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

/* Utility macros. */
int umin( int check, int ncheck );
int umax( int check, int ncheck );
int urange( int mincheck, int check, int maxcheck );
double dumin( double check, double ncheck );
double dumax( double check, double ncheck );
double durange( double mincheck, double check, double maxcheck );

#define UMIN( a, b )      ( umin( (a), (b) ) )
#define UMAX( a, b )      ( umax( (a), (b) ) )
#define URANGE(a, b, c )  ( urange( (a), (b), (c) ) )
#define LOWER( c )        ( (c) >= 'A' && (c) <= 'Z' ? (c) + 'a' - 'A' : (c) )
#define UPPER( c )        ( (c) >= 'a' && (c) <= 'z' ? (c) + 'A' - 'a' : (c) )

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

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

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

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

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

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

#define DISPOSE(point)                         \
do                                             \
{                                              \
   if( (point) )                               \
   {                                           \
      if( typeid((point)) == typeid(char*) )   \
      {                                        \
         if( in_hash_table( (char*)(point) ) ) \
         {                                     \
            log_printf( "&RDISPOSE called on STRALLOC pointer: %s, line %d\n", __FILE__, __LINE__ ); \
            log_string( "Attempting to correct." ); \
            if( str_free( (char*)(point), __FILE__, __LINE__ ) == -1 ) \
               log_printf( "&RSTRFREEing bad pointer: %s, line %d\n", __FILE__, __LINE__ ); \
         }                                     \
         else                                  \
            free( (point) );                   \
      }                                        \
      else                                     \
         free( (point) );                      \
      (point) = NULL;                          \
   }                                           \
   else                                        \
      (point) = NULL;                          \
} while(0)

#ifdef HASHSTR

#define STRALLOC(point)  str_alloc( (point), __FILE__, __LINE__ )
#define QUICKLINK(point) quick_link( (point), __FILE__, __LINE__ )

#define STRFREE(point)                           \
do                                               \
{                                                \
   if((point))                                   \
   {                                             \
      if( !in_hash_table( (point) ) )            \
      {                                          \
         log_printf( "&RSTRFREE called on str_dup pointer: %s, line %d\n", __FILE__, __LINE__ ); \
         log_string( "Attempting to correct." ); \
         free( (point) );                        \
      }                                          \
      else if( str_free((point), __FILE__, __LINE__ ) == -1 )         \
         log_printf( "&RSTRFREEing bad pointer: %s, line %d\n", __FILE__, __LINE__ ); \
      (point) = NULL;                            \
   }                                             \
   else                                          \
      (point) = NULL;                            \
} while(0)

#else

#define STRALLOC( point )  str_dup( (point) )
#define QUICKLINK( point ) str_dup( (point) )
#define STRFREE( point )   DISPOSE( (point) )

#endif

#define STRSET( point, new )    \
do                              \
{                               \
   STRFREE( (point) );          \
   (point) = STRALLOC( (new) ); \
} while(0)

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

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

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

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

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

/* Character macros. */
#define IS_AFFECTED( ch, sn )    ( xIS_SET( (ch)->affected_by, (sn) ) )
#define HAS_BODYPART( ch, part ) ( xIS_EMPTY( (ch)->xflags ) || xIS_SET( (ch)->xflags, (part) ) )

int get_ac( CHAR_DATA *ch );
int get_hitroll( CHAR_DATA *ch );
int get_damroll( CHAR_DATA *ch );
char *distime( time_t updated );
char *shorttime( time_t updated );
void remove_file( char *filename );
bool valid_pfile( char *filename );
bool can_use_path( CHAR_DATA *ch, char *direct, char *filename );
bool is_npc( CHAR_DATA *ch );
bool is_immortal( CHAR_DATA *ch );
bool is_avatar( CHAR_DATA *ch );
bool is_awake( CHAR_DATA *ch );
bool is_outside( CHAR_DATA *ch );
bool no_weather_sect( ROOM_INDEX_DATA *room );
bool is_drunk( CHAR_DATA *ch, int drunk );
bool is_devoted( CHAR_DATA *ch );
bool is_idle( CHAR_DATA *ch );
bool is_pkill( CHAR_DATA *ch );
bool can_pkill( CHAR_DATA *ch );
bool can_cast( CHAR_DATA *ch );
bool is_neutral( CHAR_DATA *ch );
bool is_evil( CHAR_DATA *ch );
bool is_good( CHAR_DATA *ch );
bool is_vampire( CHAR_DATA *ch );
bool in_clan( CHAR_DATA *ch );
bool is_clanned( CHAR_DATA *ch );
bool in_nation( CHAR_DATA *ch );
bool is_nationed( CHAR_DATA *ch );
bool in_council( CHAR_DATA *ch );
bool is_counciled( CHAR_DATA *ch );
void wait_state( CHAR_DATA *ch, int npulse );
bool can_go( ROOM_INDEX_DATA *room, int door );
bool is_floating( CHAR_DATA *ch );
bool is_valid_sn( int sn );
bool is_valid_herb( int sn );
bool is_pacifist( CHAR_DATA *ch );
bool is_retired( CHAR_DATA *ch );
bool is_guest( CHAR_DATA *ch );
bool not_authed( CHAR_DATA *ch );
bool is_waiting_for_auth( CHAR_DATA *ch );
bool is_obj_stat( OBJ_DATA *obj, int stat );
bool can_wear( OBJ_DATA *obj, int part );

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

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

#define MORPHPERS(ch, looker)   ( can_see( (looker), (ch) ) ? (ch)->morph->morph->short_desc : "someone" )

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

/* Structure for a command in the command lookup table. */
struct cmd_type
{
   CMDTYPE *next;
   char *name;
   DO_FUN *do_fun;
   char *fun_name;
   EXT_BV flags;
   short position;
   short perm;
   short log;
   struct timerset userec;
   int lag_count; /* count lag flags for this cmd - FB */
};

/* 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 struct tm *new_boot_time;
extern time_t new_boot_time_t;
extern FILE *fpArea;
extern char strArea[MIL];

extern struct race_type *race_table[MAX_RACE];
char *dis_race_name( int race );

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

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

extern char *const skill_tname[];
extern short const movement_loss[SECT_MAX];
extern char *const dir_name[];
extern char *const where_name[MAX_WHERE_NAME];
extern const short rev_dir[];
extern const int trap_door[];
extern char *const r_flags[];
extern char *const w_flags[];
extern char *const item_w_flags[];
extern char *const o_flags[];
extern char *const a_flags[];
extern char *const o_types[];
extern char *const a_types[];
extern char *const act_flags[];
extern char *const plr_flags[];
extern char *const pc_flags[];
extern char *const trap_flags[];
extern char *const ris_flags[];
extern char *const trig_flags[];
extern char *const part_flags[];
extern char *const defense_flags[];
extern char *const attack_flags[];
extern char *const area_flags[];
extern char *const ex_pmisc[];
extern char *const ex_pwater[];
extern char *const ex_pair[];
extern char *const ex_pearth[];
extern char *const ex_pfire[];

extern int const lang_array[];
extern char *const lang_names[];

extern char *const temp_settings[]; /* FB */
extern char *const precip_settings[];
extern char *const wind_settings[];
extern char *const preciptemp_msg[6][6];
extern char *const windtemp_msg[6][6];
extern char *const precip_msg[];
extern char *const wind_msg[];

extern char *const wear_locs[];
extern char *const ex_flags[];

/* Global variables. */
extern char *target_name;
extern char *ranged_target_name;
extern int numobjsloaded;
extern int nummobsloaded;
extern int physicalobjects;
extern int last_pkroom;
extern int num_descriptors;
extern struct system_data sysdata;
extern int top_sn;
extern int top_herb;

extern CMDTYPE *command_hash[126];

extern CLASS_TYPE *class_table[MAX_CLASS];
char *dis_class_name( int Class );

extern SKILLTYPE *skill_table[MAX_SKILL];
extern SOCIALTYPE *social_index[126];
extern CHAR_DATA *cur_char;
extern bool cur_char_died;
extern ch_ret global_retcode;
extern SKILLTYPE *herb_table[MAX_HERB];

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

extern SHOP_DATA        *first_shop,        *last_shop;
extern REPAIR_DATA      *first_repair,      *last_repair;
extern BAN_DATA         *first_ban,         *last_ban;
extern BAN_DATA         *first_ban_class,   *last_ban_class;
extern BAN_DATA         *first_ban_race,    *last_ban_race;
extern CHAR_DATA        *first_char,        *last_char;
extern DESCRIPTOR_DATA  *first_descriptor,  *last_descriptor;
extern OBJ_DATA         *first_object,      *last_object;
extern OBJ_DATA         *first_corpse,      *last_corpse;
extern CLAN_DATA        *first_clan,        *last_clan;
extern COUNCIL_DATA     *first_council,     *last_council;
extern AREA_DATA        *first_area,        *last_area;
extern AREA_DATA        *first_build,       *last_build;
extern AREA_DATA        *first_asort,       *last_asort;
extern AREA_DATA        *first_bsort,       *last_bsort;
extern AREA_DATA        *first_area_name,   *last_area_name;
extern LANG_DATA        *first_lang,        *last_lang;

extern CHAR_DATA *quitting_char;
extern CHAR_DATA *loading_char;
extern CHAR_DATA *saving_char;

extern EXTRACT_CHAR_DATA  *extracted_char_queue;

extern OBJ_DATA *all_obj;
extern OBJ_DATA *extracted_obj_queue;

extern time_t current_time;
extern bool fLogAll;
extern WEATHER_DATA weather_info;
extern int weath_unit;
extern int rand_factor;
extern int climate_factor;
extern int neigh_factor;
extern int max_vector;

extern struct act_prog_data *mob_act_list;

/* Command functions. */
DECLARE_DO_FUN( skill_notfound );
DECLARE_DO_FUN( do_aset );
DECLARE_DO_FUN( do_at );
DECLARE_DO_FUN( do_bash );
DECLARE_DO_FUN( do_bestow );
DECLARE_DO_FUN( do_bestowarea );
DECLARE_DO_FUN( do_bite );
DECLARE_DO_FUN( do_cast );
DECLARE_DO_FUN( do_cedit );
DECLARE_DO_FUN( do_circle );
DECLARE_DO_FUN( do_claw );
DECLARE_DO_FUN( do_close );
DECLARE_DO_FUN( do_dismount );
DECLARE_DO_FUN( do_echo );
DECLARE_DO_FUN( do_emote );
DECLARE_DO_FUN( do_examine );
DECLARE_DO_FUN( do_exits );
DECLARE_DO_FUN( do_feed );
DECLARE_DO_FUN( do_findnote );
DECLARE_DO_FUN( do_flee );
DECLARE_DO_FUN( do_for );
DECLARE_DO_FUN( do_force );
DECLARE_DO_FUN( do_forceclose );
DECLARE_DO_FUN( do_get );
DECLARE_DO_FUN( do_goto );
DECLARE_DO_FUN( do_gouge );
DECLARE_DO_FUN( do_help );
DECLARE_DO_FUN( do_lock );
DECLARE_DO_FUN( do_look );
DECLARE_DO_FUN( do_morphstat );
DECLARE_DO_FUN( do_mount );
DECLARE_DO_FUN( do_mstat );
DECLARE_DO_FUN( do_open );
DECLARE_DO_FUN( do_ostat );
DECLARE_DO_FUN( do_quaff );
DECLARE_DO_FUN( do_quit );
DECLARE_DO_FUN( do_recall );
DECLARE_DO_FUN( do_redit );
DECLARE_DO_FUN( do_restoretime );
DECLARE_DO_FUN( do_rstat );
DECLARE_DO_FUN( do_sacrifice );
DECLARE_DO_FUN( do_say );
DECLARE_DO_FUN( do_search );
DECLARE_DO_FUN( do_shout );
DECLARE_DO_FUN( do_sit );
DECLARE_DO_FUN( do_sleep );
DECLARE_DO_FUN( do_split );
DECLARE_DO_FUN( do_sset );
DECLARE_DO_FUN( do_stand );
DECLARE_DO_FUN( do_stat );
DECLARE_DO_FUN( do_steal );
DECLARE_DO_FUN( do_stun );
DECLARE_DO_FUN( do_tail );
DECLARE_DO_FUN( do_tell );
DECLARE_DO_FUN( do_transfer );
DECLARE_DO_FUN( do_unlock );
DECLARE_DO_FUN( do_wartalk );
DECLARE_DO_FUN( do_wimpy );

/*
 * Spell functions.
 * Defined in magic.c.
 */
DECLARE_SPELL_FUN( spell_null );
DECLARE_SPELL_FUN( spell_notfound );
DECLARE_SPELL_FUN( spell_dispel_evil );
DECLARE_SPELL_FUN( spell_dispel_magic );
DECLARE_SPELL_FUN( spell_earthquake );
DECLARE_SPELL_FUN( spell_energy_drain );
DECLARE_SPELL_FUN( spell_harm );
DECLARE_SPELL_FUN( spell_smaug );
DECLARE_SPELL_FUN( spell_teleport );
DECLARE_SPELL_FUN( spell_transport );

#include "dfiles.h"

/* act_comm.c */
bool circle_follow( CHAR_DATA *ch, 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( CHAR_DATA *ach, CHAR_DATA *bch );
void send_rip_screen( CHAR_DATA *ch );
void send_rip_title( CHAR_DATA *ch );
void send_ansi_title( CHAR_DATA *ch );
void send_ascii_title( CHAR_DATA *ch );
void to_channel( char *argument, char *channel, int level );
void to_channel_printf( char *channel, int level, char *fmt, ... ) __attribute__ ( ( format( printf, 3, 4 ) ) );
int knows_language( CHAR_DATA *ch, int language );
bool can_learn_lang( CHAR_DATA *ch, int language );
int countlangs( int languages );
char *translate( int percent, const char *in, const char *name );
char *obj_short( OBJ_DATA *obj );

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

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

/* act_obj.c */
void damage_obj( OBJ_DATA *obj );
short get_obj_resistance( OBJ_DATA *obj );
void save_clan_storeroom( CHAR_DATA *ch, CLAN_DATA *clan );
void obj_fall( OBJ_DATA *obj, bool through );

/* act_wiz.c */
bool create_new_race( int rcindex, char *argument );
bool create_new_class( int rcindex, char *argument );
ROOM_INDEX_DATA *find_location( CHAR_DATA *ch, char *arg );
void echo_to_all( short AT_COLOR, char *argument, short tar );
struct tm *update_time( struct tm * old_time );
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 );
void free_note( NOTE_DATA *pnote );

/* build.c */
char *flag_string( int bitvector, char *const flagarray[] );
char *ext_flag_string( EXT_BV *bitvector, char *const flagarray[] );
char *ext_class_string( EXT_BV *bitvector );
char *ext_race_string( EXT_BV *bitvector );
int get_mpflag( char *flag );
int get_dir( char *txt );
char *strip_cr( char *str );
void RelCreate( relation_type, void *, void * );
void RelDestroy( relation_type, void *, void * );
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( CHAR_DATA *ch );
bool can_rmodify( CHAR_DATA *ch, ROOM_INDEX_DATA *room );
bool can_omodify( CHAR_DATA *ch, OBJ_DATA *obj );
bool can_mmodify( CHAR_DATA *ch, CHAR_DATA *mob );
bool can_medit( CHAR_DATA *ch, MOB_INDEX_DATA *mob );
void assign_area( CHAR_DATA *ch );
EXTRA_DESCR_DATA *SetRExtra( ROOM_INDEX_DATA *room, char *keywords );
bool DelRExtra( ROOM_INDEX_DATA *room, char *keywords );
EXTRA_DESCR_DATA *SetOExtra( OBJ_DATA *obj, char *keywords );
bool DelOExtra( OBJ_DATA *obj, char *keywords );
EXTRA_DESCR_DATA *SetOExtraProto( OBJ_INDEX_DATA *obj, char *keywords );
bool DelOExtraProto( OBJ_INDEX_DATA *obj, char *keywords );
bool fold_area( AREA_DATA *tarea, char *filename, bool install );
int get_oflag( char *flag );
int get_wflag( char *flag );
void init_area_weather( void );
void save_weatherdata( void );

/* clans.c */
CLAN_DATA *get_clan( char *name );
void load_clans( void );
void save_clan( CLAN_DATA *clan );
COUNCIL_DATA *get_council( char *name );
void load_councils( void );
void save_council( COUNCIL_DATA *council );

/* comm.c */
void close_socket( DESCRIPTOR_DATA *dclose, bool force );
void write_to_buffer( DESCRIPTOR_DATA *d, const char *txt, unsigned int length );
void write_to_pager( DESCRIPTOR_DATA *d, const char *txt, unsigned int length );
void send_to_char( const char *txt, CHAR_DATA *ch );
void send_to_pager( const char *txt, CHAR_DATA *ch );
void send_to_desc( const char *txt, DESCRIPTOR_DATA *d );
void ch_printf( CHAR_DATA *ch, char *fmt, ... ) __attribute__ ( ( format( printf, 2, 3 ) ) );
void act_printf( short AType, CHAR_DATA *ch, void *arg1, void *arg2, int type, char *fmt, ... ) __attribute__ ( ( format( printf, 6, 7 ) ) );
void playing_printf( CHAR_DATA *ch, char *fmt, ... ) __attribute__ ( ( format( printf, 2, 3 ) ) );
void pager_printf( CHAR_DATA *ch, char *fmt, ... ) __attribute__ ( ( format( printf, 2, 3 ) ) );
void act( short AType, const char *format, CHAR_DATA *ch, void *arg1, void *arg2, int type );
char *myobj( OBJ_DATA *obj );

/* reset.c */
RESET_DATA *make_reset( char letter, int extra, int arg1, int arg2, int arg3, short rchance );
RESET_DATA *add_reset( ROOM_INDEX_DATA *room, char letter, int extra, int arg1, int arg2, int arg3, short rchance );
void reset_area( AREA_DATA *pArea );

/* db.c */
void show_file( CHAR_DATA *ch, char *filename );
char *str_dup( char const *str );
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, int level );
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( int vnum );
OBJ_INDEX_DATA *get_obj_index( int vnum );
ROOM_INDEX_DATA *get_room_index( int vnum );
char fread_letter( FILE *fp );
int fread_number( FILE *fp );
unsigned int fread_un_number( FILE *fp );
time_t fread_time( FILE *fp );
double fread_double( FILE *fp );
EXT_BV fread_bitvector( FILE * fp );
void fwrite_bitvector( EXT_BV * bits, FILE * fp );
char *print_bitvector( EXT_BV * bits );
char *fread_string( FILE * fp );
char *fread_flagstring( FILE * fp );
void fread_to_eol( FILE * fp );
char *fread_word( FILE * fp );
char *fread_line( FILE * fp );
int number_range( int from, int to );
int number_percent( void );
int number_door( void );
int number_bits( int width );
int number_mm( void );
int dice( int number, int size );
int interpolate( int level, int value_00, int value_32 );
void smash_tilde( char *str );
void hide_tilde( char *str );
char *show_tilde( char *str );
bool str_cmp( const char *astr, const char *bstr );
bool str_prefix( const char *astr, const char *bstr );
bool str_infix( const char *astr, const char *bstr );
bool str_suffix( const char *astr, const char *bstr );
char *capitalize( const char *str );
char *strlower( const char *str );
char *strupper( const char *str );
char *aoran( const char *str );
void append_file( CHAR_DATA *ch, char *file, char *str );
void append_to_file( char *file, char *str );
void bug( const char *str, ... ) __attribute__ ( ( format( printf, 1, 2 ) ) );
void log_string_plus( const char *str, short log_type, int level );
void log_printf_plus( short log_type, int level, const char *fmt, ... ) __attribute__ ( ( format( printf, 3, 4 ) ) );
void log_printf( const char *fmt, ... ) __attribute__ ( ( format( printf, 1, 2 ) ) );
ROOM_INDEX_DATA *make_room( int vnum, AREA_DATA *area );
OBJ_INDEX_DATA *make_object( int vnum, int cvnum, char *name );
MOB_INDEX_DATA *make_mobile( int vnum, int cvnum, char *name );
EXIT_DATA *make_exit( ROOM_INDEX_DATA *pRoomIndex, ROOM_INDEX_DATA *to_room, short door );
void load_area_file( AREA_DATA *tarea, char *filename );
void randomize_exits( ROOM_INDEX_DATA *room, short maxdir );
void make_wizlist( void );
void tail_chain( void );
void delete_room( ROOM_INDEX_DATA *room );
void delete_obj( OBJ_INDEX_DATA *obj );
void delete_mob( MOB_INDEX_DATA *mob );
void sort_area( AREA_DATA *pArea, bool proto );
void sort_area_by_name( AREA_DATA *pArea ); /* Fireblade */
size_t newmudstrlcpy( char *dst, const char *src, size_t siz, char *filename, int line );
#define mudstrlcpy( dst, src, siz )  newmudstrlcpy( (dst), (src), (siz), __FILE__, __LINE__ )

size_t mudstrlcat( char *dst, const char *src, size_t siz );

/* fight.c */
void violence_update( void );
ch_ret multi_hit( CHAR_DATA *ch, CHAR_DATA *victim, int dt );
ch_ret projectile_hit( CHAR_DATA *ch, CHAR_DATA *victim, OBJ_DATA *wield, OBJ_DATA *projectile, short dist );
short ris_damage( 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( CHAR_DATA *ch );
void check_killer( CHAR_DATA *ch, CHAR_DATA *victim );
void death_cry( 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( CHAR_DATA *ch, CHAR_DATA *victim );
bool is_hating( CHAR_DATA *ch, CHAR_DATA *victim );
bool is_fearing( CHAR_DATA *ch, CHAR_DATA *victim );
bool is_safe( CHAR_DATA *ch, CHAR_DATA *victim, bool SHOW );
bool legal_loot( CHAR_DATA *ch, CHAR_DATA *victim );
void raw_kill( CHAR_DATA *ch, CHAR_DATA *victim );
bool in_arena( CHAR_DATA *ch );
bool can_astral( CHAR_DATA *ch, CHAR_DATA *victim );

/* makeobjs.c */
OBJ_DATA *make_corpse( CHAR_DATA *ch, CHAR_DATA *killer );
void make_blood( CHAR_DATA *ch );
void make_bloodstain( ROOM_INDEX_DATA *room );
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, OBJ_DATA *obj );
EXT_BV meb( int bit );
EXT_BV multimeb( int bit, ... );

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

/* mud_prog.c */
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( char *str, CHAR_DATA *mob );
void progbug_printf( CHAR_DATA *mob, const char *fmt, ... ) __attribute__ ( ( format( printf, 2, 3 ) ) );
void rset_supermob( ROOM_INDEX_DATA *room );
void release_supermob( void );

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

/* polymorph.c */
void fwrite_morph_data( CHAR_DATA *ch, FILE * fp );
void fread_morph_data( CHAR_DATA *ch, FILE * fp );
void clear_char_morph( CHAR_MORPH * morph );
CHAR_MORPH *make_char_morph( MORPH_DATA *morph );
void free_char_morph( CHAR_MORPH * morph );
void setup_morph_vnum( void );
void unmorph_all( MORPH_DATA *morph );
MORPH_DATA *get_morph( char *arg );
MORPH_DATA *get_morph_vnum( int arg );
int do_morph_char( CHAR_DATA *ch, MORPH_DATA *morph );
MORPH_DATA *find_morph( CHAR_DATA *ch, char *target, bool is_cast );
void do_unmorph_char( CHAR_DATA *ch );
void send_morph_message( CHAR_DATA *ch, MORPH_DATA *morph, bool is_morph );
bool can_morph( CHAR_DATA *ch, MORPH_DATA *morph, bool is_cast );
void do_morph( CHAR_DATA *ch, MORPH_DATA *morph );
void do_unmorph( CHAR_DATA *ch );
void save_morphs( void );
void fwrite_morph( FILE * fp, MORPH_DATA *morph );
void load_morphs( void );
MORPH_DATA *fread_morph( FILE * fp );
void free_morph( MORPH_DATA *morph );
void morph_defaults( MORPH_DATA *morph );
void sort_morphs( void );

/* skills.c */
bool can_use_skill( CHAR_DATA *ch, int percent, int gsn );
bool check_skill( CHAR_DATA *ch, 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_duck( CHAR_DATA *ch, CHAR_DATA *victim );
bool check_block( CHAR_DATA *ch, CHAR_DATA *victim );
bool check_shieldblock( CHAR_DATA *ch, CHAR_DATA *victim );
bool check_counter( CHAR_DATA *ch, CHAR_DATA *victim, int dam );
bool check_tumble( 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 );
bool mob_fire( CHAR_DATA *ch, char *name );
CHAR_DATA *scan_for_victim( CHAR_DATA *ch, EXIT_DATA *pexit, char *name );

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

/* host.c */
bool check_host( CHAR_DATA *ch );

/* handler.c */
AREA_DATA *get_area_obj( OBJ_INDEX_DATA *obj );
double get_exp( CHAR_DATA *ch );
double get_exp_worth( CHAR_DATA *ch );
double exp_level( CHAR_DATA *ch, int level );
short get_trust( CHAR_DATA *ch );
short get_age( CHAR_DATA *ch );
char *show_birthday( CHAR_DATA *ch );
int get_played( CHAR_DATA *ch );
short get_perm_stat( int stat, CHAR_DATA *ch );
short get_curr_str( CHAR_DATA *ch );
short get_curr_int( CHAR_DATA *ch );
short get_curr_wis( CHAR_DATA *ch );
short get_curr_dex( CHAR_DATA *ch );
short get_curr_con( CHAR_DATA *ch );
short get_curr_cha( CHAR_DATA *ch );
short get_curr_lck( CHAR_DATA *ch );
bool can_take_proto( CHAR_DATA *ch );
int can_carry_n( CHAR_DATA *ch );
int can_carry_w( CHAR_DATA *ch );
bool is_name( const char *str, char *namelist );
bool is_name_prefix( const char *str, char *namelist );
bool nifty_is_name( char *str, char *namelist );
bool nifty_is_name_prefix( char *str, char *namelist );
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( 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 );
void apply_ac( CHAR_DATA *ch, OBJ_DATA *obj, int iWear, bool remove );
OBJ_DATA *get_eq_char( CHAR_DATA *ch, int iWear );
OBJ_DATA *get_eq_hold( CHAR_DATA *ch, int type );
void equip_char( CHAR_DATA *ch, OBJ_DATA *obj, int iWear );
void unequip_char( CHAR_DATA *ch, OBJ_DATA *obj );
int count_obj_list( OBJ_INDEX_DATA *pObjIndex, 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 clean_resets( ROOM_INDEX_DATA *room );
void extract_char( CHAR_DATA *ch, bool fPull );
CHAR_DATA *get_char_room( CHAR_DATA *ch, char *argument );
CHAR_DATA *get_char_world( CHAR_DATA *ch, char *argument );
OBJ_DATA *get_obj_type( OBJ_INDEX_DATA *pObjIndexData );
OBJ_DATA *get_obj_list( CHAR_DATA *ch, char *argument, OBJ_DATA *list );
OBJ_DATA *get_obj_list_rev( CHAR_DATA *ch, char *argument, OBJ_DATA *list );
OBJ_DATA *get_obj_carry( CHAR_DATA *ch, char *argument );
OBJ_DATA *get_obj_wear( CHAR_DATA *ch, char *argument );
OBJ_DATA *get_obj_vnum( CHAR_DATA *ch, int vnum );
OBJ_DATA *get_obj_here( CHAR_DATA *ch, char *argument );
OBJ_DATA *get_obj_world( CHAR_DATA *ch, char *argument );
int get_obj_number( OBJ_DATA *obj );
int get_obj_weight( OBJ_DATA *obj );
int get_real_obj_weight( OBJ_DATA *obj );
bool room_is_dark( ROOM_INDEX_DATA *pRoomIndex );
bool room_is_private( ROOM_INDEX_DATA *pRoomIndex );
CHAR_DATA *room_is_dnd( CHAR_DATA *ch, ROOM_INDEX_DATA *pRoomIndex );
bool can_see( CHAR_DATA *ch, CHAR_DATA *victim );
bool can_see_obj( CHAR_DATA *ch, OBJ_DATA *obj );
bool can_drop_obj( CHAR_DATA *ch, OBJ_DATA *obj );
char *affect_loc_name( int location );
char *affect_bit_name( EXT_BV * vector );
char *extra_bit_name( EXT_BV * extra_flags );
char *magic_bit_name( int magic_flags );
char *pull_type_name( int pulltype );
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 set_base_stats( CHAR_DATA *ch );
void fix_char( CHAR_DATA *ch );
void showaffect( CHAR_DATA *ch, AFFECT_DATA *paf );
void set_cur_char( CHAR_DATA *ch );
bool char_died( 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, int count, DO_FUN * fun, int value );
TIMER *get_timerptr( CHAR_DATA *ch, short type );
short get_timer( CHAR_DATA *ch, short type );
void extract_timer( CHAR_DATA *ch, TIMER * timer );
void remove_timer( CHAR_DATA *ch, short type );
bool in_soft_range( CHAR_DATA *ch, AREA_DATA *tarea );
bool in_hard_range( CHAR_DATA *ch, AREA_DATA *tarea );
bool chance( CHAR_DATA *ch, short percent );
OBJ_DATA *clone_object( 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( 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( CHAR_DATA *ch, CHAR_DATA *mob );
void update_aris( CHAR_DATA *ch );
AREA_DATA *get_area( char *name );  /* FB */
OBJ_DATA *get_objtype( CHAR_DATA *ch, short type );

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

/* magic.c */
bool process_spell_components( CHAR_DATA *ch, int sn );
int ch_slookup( CHAR_DATA *ch, const char *name );
int find_spell( CHAR_DATA *ch, const char *name, bool know );
int find_skill( CHAR_DATA *ch, const char *name, bool know );
int find_weapon( CHAR_DATA *ch, const char *name, bool know );
int find_tongue( CHAR_DATA *ch, const char *name, bool know );
int skill_lookup( const char *name );
int herb_lookup( const char *name );
int personal_lookup( CHAR_DATA *ch, 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 );
int bsearch_skill_prefix( const char *name, int first, int top );
bool saves_poison_death( int level, CHAR_DATA *victim );
bool saves_wand( int level, CHAR_DATA *victim );
bool saves_para_petri( int level, CHAR_DATA *victim );
bool saves_breath( int level, CHAR_DATA *victim );
bool saves_spell_staff( int level, CHAR_DATA *victim );
ch_ret obj_cast_spell( int sn, int level, CHAR_DATA *ch, CHAR_DATA *victim, OBJ_DATA *obj );
int dice_parse( CHAR_DATA *ch, int level, char *texp );
SKILLTYPE *get_skilltype( int sn );
short get_chain_type( ch_ret retcode );
ch_ret chain_spells( int sn, int level, CHAR_DATA *ch, void *vo, short chain );

/* save.c */
/* object saving defines for fread/write_obj. -- Altrag */
#define OS_CARRY   0
#define OS_CORPSE  1
#define OS_AUCTION 2
#define OS_LOCKER  3

void de_equipchar( CHAR_DATA *ch );
void re_equipchar( CHAR_DATA *ch );
void save_char_obj( CHAR_DATA *ch );
bool load_char_obj( DESCRIPTOR_DATA *d, char *name, bool preload, bool copyover );
void set_alarm( long seconds );
void requip_char( CHAR_DATA *ch );
void fwrite_obj( CHAR_DATA *ch, OBJ_DATA *obj, FILE *fp, int iNest, short os_type, bool hotboot );
void fread_obj( CHAR_DATA *ch, NOTE_DATA *pnote, FILE *fp, short os_type );
CHAR_DATA *fread_mobile( FILE *fp );
void fwrite_mobile( FILE *fp, CHAR_DATA *mob );

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

/* tables.c */
int get_skill( char *skilltype );
char *spell_name( SPELL_FUN *spell );
char *skill_name( DO_FUN *skill );
void load_skill_table( void );
void save_skill_table( void );
void sort_skill_table( void );
void remap_slot_numbers( void );
void load_socials( void );
void save_socials( void );
void load_commands( void );
void save_commands( void );
SPELL_FUN *spell_function( char *name );
DO_FUN *skill_function( char *name );
void write_class_file( int cl );
void save_classes( void );
void save_races( void );
void load_classes( void );
void load_herb_table( void );
void save_herb_table( void );
void load_races( void );
void load_tongues( void );

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

/* update.c */
void advance_level( CHAR_DATA *ch );
void gain_exp( CHAR_DATA *ch, double gain );
void gain_condition( CHAR_DATA *ch, int iCond, int value );
void check_alignment( CHAR_DATA *ch );
void update_handler( void );
void remove_portal( OBJ_DATA *portal );
void weather_update( void );

/* hashstr.c */
char *str_alloc( char *str, char *filename, int line );
char *quick_link( char *str, char *filename, int line );
int str_free( char *str, char *filename, int line );
void show_hash( int count );
char *hash_stats( void );
char *check_hash( char *str );
void hash_dump( int hash );
void show_high_hash( int top );
bool in_hash_table( char *str );

/* Map Structures */
DECLARE_DO_FUN( do_mapout );

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

void oprog_speech_trigger( char *txt, CHAR_DATA *ch );
void oprog_random_trigger( OBJ_DATA *obj );
void oprog_wear_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
bool oprog_use_trigger( CHAR_DATA *ch, OBJ_DATA *obj, CHAR_DATA *vict, OBJ_DATA *targ );
void oprog_remove_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_sac_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_open_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_close_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_put_trigger( CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *container );
void oprog_zap_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
char *oprog_type_to_name( int type );
void oprog_greet_trigger( CHAR_DATA *ch );
void oprog_get_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_examine_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_pull_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_push_trigger( CHAR_DATA *ch, OBJ_DATA *obj );

/* mud prog defines */
#define ERROR_PROG    -1
#define IN_FILE_PROG  -2

typedef enum
{
   ACT_PROG,      SPEECH_PROG, RAND_PROG,   FIGHT_PROG,     DEATH_PROG,
   HITPRCNT_PROG, ENTRY_PROG,  GREET_PROG,  ALL_GREET_PROG, GIVE_PROG,
   BRIBE_PROG,    HOUR_PROG,   TIME_PROG,   WEAR_PROG,      REMOVE_PROG,
   SAC_PROG,      LOOK_PROG,   EXA_PROG,    ZAP_PROG,       GET_PROG,
   DROP_PROG,     DAMAGE_PROG, REPAIR_PROG, PULL_PROG,      PUSH_PROG,
   SLEEP_PROG,    REST_PROG,   LEAVE_PROG,  SCRIPT_PROG,    USE_PROG,
   SCRAP_PROG,    OPEN_PROG,   CLOSE_PROG,  PUT_PROG
} prog_types;

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 *ch );
void rprog_speech_trigger( char *txt, CHAR_DATA *ch );
void rprog_random_trigger( CHAR_DATA *ch );
void rprog_time_trigger( ROOM_INDEX_DATA *room );
void rprog_hour_trigger( ROOM_INDEX_DATA *room );
char *rprog_type_to_name( int type );
void oprog_act_trigger( char *buf, OBJ_DATA *mobj, CHAR_DATA *ch, OBJ_DATA *obj, void *vo );
void rprog_act_trigger( char *buf, ROOM_INDEX_DATA *room, CHAR_DATA *ch, OBJ_DATA *obj, void *vo );

#define LEARNED( ch, sn )   ( is_npc( (ch) ) ? 80 : URANGE( 0, ch->pcdata->learned[sn], 100 ) )
int get_adept( CHAR_DATA *ch, int sn );