EmberMUD-0.9.40-Pre4/
EmberMUD-0.9.40-Pre4/area/MOBProgs/
EmberMUD-0.9.40-Pre4/area/OBJProgs/
EmberMUD-0.9.40-Pre4/area/ROOMProgs/
EmberMUD-0.9.40-Pre4/clan/
EmberMUD-0.9.40-Pre4/gods/
EmberMUD-0.9.40-Pre4/log/
EmberMUD-0.9.40-Pre4/player/
EmberMUD-0.9.40-Pre4/src/MSVC/
EmberMUD-0.9.40-Pre4/src/Sleep/
EmberMUD-0.9.40-Pre4/src/StartMUD/
EmberMUD-0.9.40-Pre4/src/Win32Common/
#define EMBER_MUD_VERSION         "`WEmberMUD Release 0.9.40`w\n\r"

#ifndef merc_h__
#define merc_h__
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/

/*
 * Accommodate old non-Ansi compilers.
 */

#if defined(WIN32)
#include <stdio.h>
#if defined(unix)
#undef unix
#endif
#endif

#if defined(TRADITIONAL)
#define const
#define args( list )                    ( )
#define DECLARE_DO_FUN( fun )           void fun( )
#define DECLARE_SPEC_FUN( fun )         bool fun( )
#define DECLARE_SPELL_FUN( fun )        void fun( )
#else
#define args( list )                    list
#define DECLARE_DO_FUN( fun )           DO_FUN    fun
#define DECLARE_SPEC_FUN( fun )         SPEC_FUN  fun
#define DECLARE_SPELL_FUN( fun )        SPELL_FUN fun
#endif

/* system calls */
#ifndef cbuilder
int unlink();
int system();
#endif

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

#if     !defined(TRUE)
#define TRUE     1
#endif

#if     defined(_AIX)
#if     !defined(const)
#define const
#endif
typedef int                             sh_int;
typedef int                             bool;
#define unix
#else
typedef short   int                     sh_int;
#if !defined(CPP)
typedef unsigned char                   bool;
#endif
#endif

/*
 * 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  descriptor_data         DESCRIPTOR_DATA;
typedef struct  exit_data               EXIT_DATA;
typedef struct  extra_descr_data        EXTRA_DESCR_DATA;
typedef struct  help_data               HELP_DATA;
typedef struct  kill_data               KILL_DATA;
typedef struct  mob_index_data          MOB_INDEX_DATA;
typedef struct  note_data               NOTE_DATA;
typedef struct  obj_data                OBJ_DATA;
typedef struct  obj_index_data          OBJ_INDEX_DATA;
typedef struct  pc_data                 PC_DATA;
typedef struct  gen_data                GEN_DATA;
typedef struct  reset_data              RESET_DATA;
typedef struct  room_index_data         ROOM_INDEX_DATA;
typedef struct  shop_data               SHOP_DATA;
typedef struct  time_info_data          TIME_INFO_DATA;
typedef struct  weather_data            WEATHER_DATA;
typedef struct  clan_data            CLAN_DATA;
typedef struct  mob_prog_data           MPROG_DATA;
typedef struct  mob_prog_act_list       MPROG_ACT_LIST;
typedef struct  raffect_data            RAFFECT_DATA;
typedef struct  queue_data              QUEUE_DATA;
typedef struct  last_data               LAST_DATA;

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

#include "board.h"
#include "config.h"
#include <signal.h>

/* Just a note....
   I have to take this out to get it to compile on my Linux system.
   I don't know why, but nothing happens when I remove it...
	-Kyle
 */
#if defined(unix)
#include <unistd.h>
#endif

#include <stdarg.h>

struct clan_data
{
	CLAN_DATA * next;
	sh_int  number;
	char *  name;
	char *  whoname;
	char *  leader;
	char *  members[MAX_CLAN_MEMBERS];
	char *  god;
	sh_int  max_members;
	sh_int  min_level;
	sh_int  num_members;
	long            clan_flags;
	long            join_flags;
	int             cost_gold;
	sh_int  recall_room;
	sh_int  kills[MAX_CLAN];
	sh_int  deaths[MAX_CLAN];
	char *  command;
	char *  skill;
	char *  rank[MAX_RANK];
	int             clan_fund;
};

/*
 * Site ban structure.
 */
struct  ban_data
{
    BAN_DATA *  next;
    char *      name;
};

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

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

/*
 * Descriptor (channel) structure.
 */
struct  descriptor_data
{
   DESCRIPTOR_DATA *    next;
   DESCRIPTOR_DATA *    snoop_by;
   CHAR_DATA *          character;
   CHAR_DATA *          original;
   char *               host;
   sh_int               descriptor;
   sh_int               connected;
   bool                 fcommand;
   bool                 ansi;           /* ANSI COLOR ENABLED? */
   char                 inbuf           [4 * MAX_INPUT_LENGTH];
   char                 incomm          [MAX_INPUT_LENGTH];
   char                 inlast          [MAX_INPUT_LENGTH];
   int                  repeat;
   char *               outbuf;
   int                  outsize;
   int                  outtop;
   char *               showstr_head;
   char *               showstr_point;
   void *               pEdit;          /* OLC */
   char **              pString;        /* OLC */
   int                  editor;         /* OLC */
};

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

struct  int_app_type
{
    sh_int      learn;
};

struct  wis_app_type
{
    sh_int      practice;
};

struct  dex_app_type
{
    sh_int      defensive;
};

struct  con_app_type
{
    sh_int      hitp;
    sh_int      shock;
};

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

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

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

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

struct race_type
{
    char *      name;                   /* call name of the race */
    bool        pc_race;                /* can be chosen by pcs */
    long        act;                    /* act bits for the race */
    long        aff;                    /* aff bits for the race */
    long        off;                    /* off bits for the race */
    long        imm;                    /* imm bits for the race */
    long        res;                    /* res bits for the race */
    long        vuln;                   /* vuln bits for the race */
    long        form;                   /* default form flag for the race */
    long        parts;                  /* default parts for the race */
};

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

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

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

struct raffect_data
{
   RAFFECT_DATA         *next;
   sh_int                type;
   char                 *dam_name;
   char                 *room_message;
   char                 *vict_message;
   sh_int                timer;
   sh_int                val0;
   sh_int                val1;
   sh_int                val2;
   sh_int                val3;
   sh_int                val4;
};

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

/*
 * Prototype for a mob.
 * This is the in-memory version of #MOBILES.
 */
struct  mob_index_data
{
    MOB_INDEX_DATA *    next;
    SPEC_FUN *          spec_fun;
    SHOP_DATA *         pShop;
    AREA_DATA *         area;           /* OLC */
    sh_int              vnum;
    sh_int              count;
    sh_int              killed;
    char *              player_name;
    char *              short_descr;
    char *              long_descr;
    char *              description;
    long                act;
    long                affected_by;
    sh_int              alignment;
    sh_int              level;
    sh_int              hitroll;
    sh_int              hit[3];
    sh_int              mana[3];
    sh_int              damage[3];
    sh_int              ac[4];
    sh_int              dam_type;
    long                off_flags;
    long                imm_flags;
    long                res_flags;
    long                vuln_flags;
    sh_int              start_pos;
    sh_int              default_pos;
    sh_int              sex;
    sh_int              race;
    long                gold;
    long                form;
    long                parts;
    sh_int              size;
    sh_int              material;
    MPROG_DATA *        mudprogs;
    int                 progtypes;
    sh_int              rnd_obj_percent;
    sh_int              rnd_obj_num;
    long                rnd_obj_types;
};


/*
 * One character (PC or NPC).
 */
struct  char_data
{
   CHAR_DATA *          next;
   CHAR_DATA *          next_in_room;
   CHAR_DATA *          master;
   CHAR_DATA *          leader;
   CHAR_DATA *          fighting;
   CHAR_DATA *          reply;
   CHAR_DATA *          pet;
   CHAR_DATA *          memory;
   SPEC_FUN *           spec_fun;
   MOB_INDEX_DATA *     pIndexData;
   DESCRIPTOR_DATA *    desc;
   AFFECT_DATA *        affected;
   OBJ_DATA *           carrying;
   ROOM_INDEX_DATA *    in_room;
   ROOM_INDEX_DATA *    was_in_room;
   PC_DATA *            pcdata;
   GEN_DATA *           gen_data;
   char *               name;
   bool                 beep;
   sh_int               version;
   char *               short_descr;
   char *               long_descr;
   char *               description;
   sh_int               sex;
   sh_int                               Class;
   sh_int               race;
   sh_int               level;
   sh_int               trust;
   int                  played;
   int                  lines;  /* for the pager */
   time_t               logon;
   time_t               last_note;
   sh_int               timer;
   sh_int               wait;
   sh_int               daze;
   sh_int               hit;
   sh_int               max_hit;
   sh_int               mana;
   sh_int               max_mana;
   sh_int               move;
   sh_int               max_move;
   long                 gold;
   long                 exp;
   long                 exp_stack;
   long                 act;
   long                 comm;   /* RT added to pad the vector */
   long                 imm_flags;
   long                 res_flags;
   long                 vuln_flags;
   sh_int               invis_level;
   long                 affected_by;
   sh_int               position;
   sh_int               practice;
   sh_int               train;
   sh_int               carry_weight;
   sh_int               carry_number;
   sh_int               saving_throw;
   sh_int               alignment;
   sh_int               hitroll;
   sh_int               damroll;
   sh_int               armor[4];
   sh_int               wimpy;
   /* stats */
   sh_int               perm_stat[MAX_STATS];
   sh_int               mod_stat[MAX_STATS];
   /* parts stuff */
   long                 form;
   long                 parts;
   sh_int               size;
   sh_int               material;
   /* mobile stuff */
   long                 off_flags;
   sh_int               damage[3];
   sh_int               dam_type;
   sh_int               start_pos;
   sh_int               default_pos;
   MPROG_ACT_LIST *     mpact;
   int                  mpactnum;
   int                  mobinvis;
#if defined(cbuilder)
   void *                               TNode;
#endif

};

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;
    char *      arglist;
    char *      comlist;
};
extern bool    MOBtrigger;

/*
 * Data which only PC's have.
 */
struct  pc_data
{
    PC_DATA *           next;
    QUEUE_DATA *        fmessage;
    QUEUE_DATA *        message;
    QUEUE_DATA *        ftell_q;
    QUEUE_DATA *        tell_q;
    BOARD_DATA *        board; /* The current board */
    time_t              last_note[MAX_BOARD]; /* last note for the boards */
    NOTE_DATA *         in_progress;
    int                 messages;
    int                 tells;
    char *              pwd;
    char *              bamfin;
    char *              bamfout;
    char *              title;
    sh_int              perm_hit;
    sh_int              perm_mana;
    sh_int              perm_move;
    sh_int              true_sex;
    int                 last_level;
    int                 mprog_edit;
    int                 security;
    sh_int              condition       [3];
    sh_int              learned         [MAX_SKILL];
    bool                group_known     [MAX_GROUP];
    sh_int              points;
    bool                confirm_delete;
    bool                confirm_pk;
    char *              prompt;
    ROOM_INDEX_DATA *   recall_room;
    int                 chaos_score;
    char *              alias[MAX_ALIAS];
    char *              alias_sub[MAX_ALIAS];
    char *              nemesis;
    char *              comment;
    char *              email;
    int                 pk_deaths;
    int                 pk_kills;
    int                 vnum_range[ 2 ];
    sh_int                      clan;
    sh_int                      join_status;
    CHAR_DATA *         clan_ch;
    sh_int                      join_clan;
    sh_int                      clan_rank;
    char *              who_race;
    char *              who_prefix;
};


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

/* Message queue data */
struct queue_data
{
    QUEUE_DATA *        next;
    char *              sender;
    char *              text;
};

/* Last Messages list */
struct last_data
{
   LAST_DATA *          next;
   char *               msg;    /* Text being stored. */
   sh_int               level;  /* Level of sender.   */
   bool                 hidden; /* Sender invis?      */
   char *               sender; /* Who sent it?       */
};

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

/*
 * Extra description data for a room or object.
 */
struct  extra_descr_data
{
    EXTRA_DESCR_DATA *next;     /* Next 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 *  extra_descr;
    AFFECT_DATA *       affected;
    AREA_DATA *         area;           /* OLC */
    MPROG_DATA *        mudprogs;        /* mudprogs */
    int                 progtypes;          /* mudprogs */    
    char *              name;
    char *              short_descr;
    char *              description;
    sh_int              vnum;
    sh_int              reset_num;
    sh_int              material;
    sh_int              item_type;
    int                 extra_flags;
    sh_int              wear_flags;
    sh_int              level;
    sh_int              condition;
    sh_int              count;
    sh_int              weight;
    int                 cost;
    int                 value[5];
    sh_int                      clan;
};

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

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

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

/*
 * Area-reset definition.
 */
struct  reset_data
{
    RESET_DATA *        next;
    char                command;
    sh_int              arg1;
    sh_int              arg2;
    sh_int              arg3;
};

/*
 * Area definition.
 */
struct  area_data
{
    AREA_DATA *         next;
    RESET_DATA *        reset_first;
    RESET_DATA *        reset_last;
    char *              name;
    sh_int              age;
    sh_int              nplayer;
    bool                empty;          /* ROM OLC */
    char *              filename;       /* OLC */
    char *              builders;       /* OLC */ /* Listing of */
    int                 security;       /* OLC */ /* Value 1-9  */
    int                 lvnum;          /* OLC */ /* Lower vnum */
    int                 uvnum;          /* OLC */ /* Upper vnum */
    int                 vnum;           /* OLC */ /* Area vnum  */
    int                 area_flags;     /* OLC */
};

/*
 * Room type.
 */
struct  room_index_data
{
   ROOM_INDEX_DATA     *next;
   RESET_DATA          *reset_first;    /* OLC */
   RESET_DATA          *reset_last;     /* OLC */
   CHAR_DATA           *people;
   OBJ_DATA            *contents;
   EXTRA_DESCR_DATA    *extra_descr;
   AREA_DATA           *area;
   EXIT_DATA           *exit    [6];
   char                *name;
   char                *description;
   sh_int               vnum;
   int                  room_flags;
   sh_int               light;
   sh_int               sector_type;
   RAFFECT_DATA        *raffect;
   MPROG_ACT_LIST       *mpact;          /* mudprogs */
   int                 mpactnum;       /* mudprogs */    
   MPROG_DATA *        mudprogs;
   int                 progtypes;   
};

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

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

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

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

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

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

extern sh_int  gsn_bash;
extern sh_int  gsn_berserk;
extern sh_int  gsn_dirt;
extern sh_int  gsn_hand_to_hand;
extern sh_int  gsn_trip;
 
extern sh_int  gsn_fast_healing;
extern sh_int  gsn_haggle;
extern sh_int  gsn_lore;
extern sh_int  gsn_meditation;
 
extern sh_int  gsn_scrolls;
extern sh_int  gsn_staves;
extern sh_int  gsn_wands;
extern sh_int  gsn_recall;
extern sh_int  gsn_brew;
extern sh_int  gsn_scribe;

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

/*
 * Character macros.
 */
#define IS_NPC(ch)              (IS_SET((ch)->act, ACT_IS_NPC))
#define IS_IMMORTAL(ch)         (get_trust(ch) >= LEVEL_IMMORTAL)
#define CH(d)                   ((d)->original ? (d)->original : (d)->character)
#define IS_HERO(ch)             (get_trust(ch) >= LEVEL_HERO)
#define IS_TRUSTED(ch,level)    (get_trust((ch)) >= (level))
#define IS_AFFECTED(ch, sn)     (IS_SET((ch)->affected_by, (sn)))
#define IS_VALID(data)          ((data) != NULL && (data)->valid)
#define VALIDATE(data)          ((data)->valid = TRUE)
#define INVALIDATE(data)        ((data)->valid = FALSE)

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

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

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

#define IS_OUTSIDE(ch)          (!IS_SET(                                   \
				    (ch)->in_room->room_flags,              \
				    ROOM_INDOORS))

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

/*
 * Object macros.
 */
#define CAN_WEAR(obj, part)     (IS_SET((obj)->wear_flags,  (part)))
#define IS_OBJ_STAT(obj, stat)  (IS_SET((obj)->extra_flags, (stat)))
#define IS_WEAPON_STAT(obj,stat)(IS_SET((obj)->value[4],(stat)))

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

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

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

#if defined(cbuilder)
extern  const	struct	class_type	    class_table     [MAX_CLASS+1];
#else
extern  const	struct	class_type      class_table     [MAX_CLASS];
#endif

extern  const   struct  attack_type     attack_table    [];
extern  const   struct  race_type       race_table      [];
extern  const   struct  pc_race_type    pc_race_table   [];
extern  const   struct  liq_type        liq_table       [LIQ_MAX];
extern  const   struct  skill_type      skill_table     [MAX_SKILL];
extern  const   struct  group_type      group_table     [MAX_GROUP];
extern          struct social_type      social_table    [MAX_SOCIALS];

/*
 * Global variables.
 */
/* from handler.c */
extern char thetime[7];
extern char thedate[10];

extern          HELP_DATA         *     help_first;
extern          SHOP_DATA         *     shop_first;
extern               CLAN_DATA         *     clan_first; 
extern               CLAN_DATA         *     clan_last; 

extern          BAN_DATA          *     ban_list;
extern          CHAR_DATA         *     char_list;
extern          DESCRIPTOR_DATA   *     descriptor_list;
extern          NOTE_DATA         *     note_list;
extern          OBJ_DATA          *     object_list;

extern          MPROG_DATA        *     mprog_free;
extern          AFFECT_DATA       *     affect_free;
extern          BAN_DATA          *     ban_free;
extern          CHAR_DATA         *     char_free;
extern          DESCRIPTOR_DATA   *     descriptor_free;
extern          EXTRA_DESCR_DATA  *     extra_descr_free;
extern          LAST_DATA         *     flast;
extern          LAST_DATA         *     last_list;
extern          LAST_DATA         *     flast_imm;
extern          LAST_DATA         *     last_imm;
extern          NOTE_DATA         *     note_free;
extern          OBJ_DATA          *     obj_free;
extern          PC_DATA           *     pcdata_free;
extern          RAFFECT_DATA      *     raffect_free;

extern          char                    bug_buf         [];
extern          time_t                  current_time;
extern          bool                    fLogAll;
extern          FILE *                  fpReserve;
extern          KILL_DATA               kill_table      [];
extern          char                    log_buf         [];
extern          TIME_INFO_DATA          time_info;
extern          WEATHER_DATA            weather_info;

/*
 * OS-dependent declarations.
 * These are all very standard library functions,
 *   but some systems have incomplete or non-ansi header files.
 */

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

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

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

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

#if             defined(WIN32)

int gettimeofday(struct timeval *, void *); /* Second parameter is for compatibility with Unix GetTimeOfDay */
void bzero( char * data, unsigned long length);
char *crypt(char *key, char *salt);

#define SIGTRAP -1  /* CBuilder doesn't have SIGTRAP, setting */
		    /* it to match SIG_ERR                                        */

#endif

#if             defined(cbuilder)
void update_gui(void); /* Update GUI stats and run GUI commands. */
void SetStatus (char *Message);
#endif

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

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

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

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

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

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

/*
 * Our function prototypes.
 * One big lump ... this is every global function in Ember.
 */
#define CD      CHAR_DATA
#define MID     MOB_INDEX_DATA
#define OD      OBJ_DATA
#define OID     OBJ_INDEX_DATA
#define RID     ROOM_INDEX_DATA
#define SF      SPEC_FUN
#define AD      AFFECT_DATA
#define RAD     RAFFECT_DATA

/* act_comm.c */
bool    is_note_to      args( ( CHAR_DATA *ch, NOTE_DATA *pnote ) );
void    check_sex       args( ( CHAR_DATA *ch) );
void    add_follower    args( ( CHAR_DATA *ch, CHAR_DATA *master ) );
void    stop_follower   args( ( CHAR_DATA *ch ) );
void    nuke_pets       args( ( CHAR_DATA *ch ) );
void    die_follower    args( ( CHAR_DATA *ch ) );
bool    is_same_group   args( ( CHAR_DATA *ach, CHAR_DATA *bch ) );

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

/* act_move.c */
void    move_char       args( ( CHAR_DATA *ch, int door, bool follow ) );

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

/* act_wiz.c */

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

/* comm.c */
void    show_string     args( ( struct descriptor_data *d, char *input) );
void    close_socket    args( ( DESCRIPTOR_DATA *dclose ) );
void    write_to_buffer args( ( DESCRIPTOR_DATA *d, const char *txt,
			    int length ) );
void    send_to_char    args( ( const char *txt, CHAR_DATA *ch ) );
void    page_to_char    args( ( const char *txt, CHAR_DATA *ch ) );
void    printf_to_char  args( (CHAR_DATA *ch, char *fmt, ...) );
void    act             args( ( const char *format, CHAR_DATA *ch,
			    const void *arg1, const void *arg2, int type ) );
void    act_new         args( ( const char *format, CHAR_DATA *ch, 
			    const void *arg1, const void *arg2, int type,
			    int min_pos) );
int     figure_difference args( ( int points) );

/* db.c */

#if !defined(CPP)
char *  remove_color    args( ( const char *str ) );
#endif
int     boot_db         args( ( ) );
void    update_last     args( ( char *line1, char *line2, char *line3) );
void    area_update     args( ( void ) );
CD *    create_mobile   args( ( MOB_INDEX_DATA *pMobIndex ) );
void    clone_mobile    args( ( CHAR_DATA *parent, CHAR_DATA *clone) );
OD *    create_object   args( ( OBJ_INDEX_DATA *pObjIndex, int level ) );
void    clone_object    args( ( OBJ_DATA *parent, OBJ_DATA *clone ) );
void    clear_char      args( ( CHAR_DATA *ch ) );
void    free_char       args( ( CHAR_DATA *ch ) );
char *  get_extra_descr args( ( const char *name, EXTRA_DESCR_DATA *ed ) );
MID *   get_mob_index   args( ( int vnum ) );
OID *   get_obj_index   args( ( int vnum ) );
RID *   get_room_index  args( ( int vnum ) );
char    fread_letter    args( ( FILE *fp ) );
int     fread_number    args( ( FILE *fp ) );
long    fread_flag      args( ( FILE *fp ) );
char *  fread_string    args( ( FILE *fp ) );
char *  fread_string_eol args(( FILE *fp ) );
void    fread_to_eol    args( ( FILE *fp ) );
char *  get_word        args( ( FILE *fp ) );
char *  fread_word      args( ( FILE *fp ) );
long    flag_convert    args( ( char letter) );
void *  alloc_mem       args( ( int sMem ) );
void *  alloc_perm      args( ( int sMem ) );
void    free_mem        args( ( void *pMem, int sMem ) );
unsigned int     str_len         args( ( const char *str ) );
char *  str_dup         args( ( const char *str ) );
void    free_string     args( ( char *pstr ) );
int     number_fuzzy    args( ( int number ) );
int     number_range    args( ( int from, int to ) );
int     number_percent  args( ( void ) );
int     number_door     args( ( void ) );
int     number_bits     args( ( int width ) );
int     number_mm       args( ( void ) );
int     dice            args( ( int number, int size ) );
int     interpolate     args( ( int level, int value_00, int value_32 ) );
void    smash_tilde     args( ( char *str ) );
bool    str_cmp         args( ( const char *astr, const char *bstr ) );
bool    str_prefix      args( ( const char *astr, const char *bstr ) );
bool    str_infix       args( ( const char *astr, const char *bstr ) );
bool    str_suffix      args( ( const char *astr, const char *bstr ) );
char *  capitalize      args( ( const char *str ) );
void    append_file     args( ( CHAR_DATA *ch, char *file, char *str ) );
void    bug             args( ( const char *str, ... ) );
void    bug_trace       args( ( const char *str ) );
#if !defined(CPP)
void    logf_string     args( ( const char *str, ... ) );
void    log_string      args( ( const char *str ) );
#endif
void    tail_chain      args( ( void ) );

/* fight.c */
bool    is_safe         args( (CHAR_DATA *ch, CHAR_DATA *victim ) );
bool    is_safe_spell   args( (CHAR_DATA *ch, CHAR_DATA *victim, bool area ) );
void    violence_update args( ( void ) );
void    multi_hit       args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt ) );
bool    damage          args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dam,
			    int dt, int Class ) );
bool    new_damage      args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dam,
				int dt, int Class, bool show ) );
bool    raf_damage      args( ( CHAR_DATA *victim, int dam, int dam_type,
			       char *dam_name) );
void     update_pos      args( ( CHAR_DATA *victim ) ); 
void    stop_fighting   args( ( CHAR_DATA *ch, bool fBoth ) );

/* handler.c */
char *get_curdate();
char *get_curtime();
char *get_time();
char *get_date();
AD      *affect_find args( (AFFECT_DATA *paf, int sn));
int     check_immune    args( (CHAR_DATA *ch, int dam_type) );
int     material_lookup args( ( const char *name) );
char *  material_name   args( ( sh_int num ) );
int     race_lookup     args( ( const char *name) );
int     class_lookup    args( ( const char *name) );
int     get_skill       args( ( CHAR_DATA *ch, int sn ) );
int     get_weapon_sn   args( ( CHAR_DATA *ch ) );
int     get_second_weapon_sn    args( ( CHAR_DATA *ch ) );
int     get_weapon_skill args(( CHAR_DATA *ch, int sn ) );
int     get_age         args( ( CHAR_DATA *ch ) );
void    reset_char      args( ( CHAR_DATA *ch )  );
int     get_trust       args( ( CHAR_DATA *ch ) );
int     get_curr_stat   args( ( CHAR_DATA *ch, int stat ) );
int     get_max_train   args( ( CHAR_DATA *ch, int stat ) );
int     can_carry_n     args( ( CHAR_DATA *ch ) );
int     can_carry_w     args( ( CHAR_DATA *ch ) );
bool    is_name         args( ( char *str, char *namelist ) );
bool    is_full_name    args( ( const char *str, char *namelist ) );
bool    is_exact_name   args( ( char *str, char *namelist ) );
void    affect_to_char  args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void    affect_to_obj   args( ( OBJ_DATA *obj, AFFECT_DATA *paf ) );
void    affect_remove   args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void    affect_remove_obj args( (OBJ_DATA *obj, AFFECT_DATA *paf ) );
void    affect_strip    args( ( CHAR_DATA *ch, int sn ) );
bool    is_affected     args( ( CHAR_DATA *ch, int sn ) );
void    affect_join     args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void    char_from_room  args( ( CHAR_DATA *ch ) );
void    char_to_room    args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *pRoomIndex ) );
void    obj_to_char     args( ( OBJ_DATA *obj, CHAR_DATA *ch ) );
void    obj_from_char   args( ( OBJ_DATA *obj ) );
int     apply_ac        args( ( OBJ_DATA *obj, int iWear, int type ) );
OD *    get_eq_char     args( ( CHAR_DATA *ch, int iWear ) );
void    equip_char      args( ( CHAR_DATA *ch, OBJ_DATA *obj, int iWear ) );
void    unequip_char    args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
int     count_obj_list  args( ( OBJ_INDEX_DATA *obj, OBJ_DATA *list ) );
void    obj_from_room   args( ( OBJ_DATA *obj ) );
void    obj_to_room     args( ( OBJ_DATA *obj, ROOM_INDEX_DATA *pRoomIndex ) );
void    obj_to_obj      args( ( OBJ_DATA *obj, OBJ_DATA *obj_to ) );
void    obj_from_obj    args( ( OBJ_DATA *obj ) );
void    extract_obj     args( ( OBJ_DATA *obj ) );
void    extract_char    args( ( CHAR_DATA *ch, bool fPull ) );
void    pk_extract_char args( ( CHAR_DATA *ch, bool fPull ) );
CD *    get_char_room   args( ( CHAR_DATA *ch, char *argument ) );
CD *    get_char_world  args( ( CHAR_DATA *ch, char *argument ) );
OD *    get_obj_type    args( ( OBJ_INDEX_DATA *pObjIndexData ) );
OD *    get_obj_list    args( ( CHAR_DATA *ch, char *argument,
			    OBJ_DATA *list ) );
OD *    get_obj_carry   args( ( CHAR_DATA *ch, char *argument ) );
OD *    get_obj_wear    args( ( CHAR_DATA *ch, char *argument ) );
OD *    get_obj_here    args( ( CHAR_DATA *ch, char *argument ) );
OD *    get_obj_world   args( ( CHAR_DATA *ch, char *argument ) );
OD *    create_money    args( ( int amount ) );
int     get_obj_number  args( ( OBJ_DATA *obj ) );
int     get_obj_weight  args( ( OBJ_DATA *obj ) );
bool    room_is_dark    args( ( ROOM_INDEX_DATA *pRoomIndex ) );
bool    room_is_private args( ( ROOM_INDEX_DATA *pRoomIndex ) );
bool    can_see         args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool    can_see_obj     args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
bool    can_see_room    args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *pRoomIndex) );
bool    can_drop_obj    args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
char *  item_type_name  args( ( OBJ_DATA *obj ) );
char *  affect_loc_name args( ( int location ) );
char *  affect_bit_name args( ( int vector ) );
char *  extra_bit_name  args( ( int extra_flags ) );
char *  wear_bit_name   args( ( int wear_flags ) );
char *  act_bit_name    args( ( int act_flags ) );
char *  off_bit_name    args( ( int off_flags ) );
char *  imm_bit_name    args( ( int imm_flags ) );
char *  form_bit_name   args( ( int form_flags ) );
char *  part_bit_name   args( ( int part_flags ) );
char *  weapon_bit_name args( ( int weapon_flags ) );
char *  comm_bit_name   args( ( int comm_flags ) );
bool    new_raffect     args( ( char *type, int vnum ) );
RAD  *  raffect_find    args( ( int vnum, int slot ) );

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

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

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

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

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

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

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


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

/*
 * This structure is used in special.c to lookup spec funcs and
 * also in olc_act.c to display listings of spec funcs.
 */
struct spec_type
{
    char *      spec_name;
    SPEC_FUN *  spec_fun;
};

/*
 * This structure is used in bit.c to lookup flags and stats.
 */
struct flag_type
{
    char * name;
    int  bit;
    bool settable;
};

/*
 * Interp.c
 */
DECLARE_DO_FUN( do_olc       );
DECLARE_DO_FUN( do_asave     );
DECLARE_DO_FUN( do_alist     );
DECLARE_DO_FUN( do_resets    );
DECLARE_DO_FUN( do_sendinfo  );

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

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

extern          int                     top_mprog;
extern          int                     top_oprog;
extern          int                     top_rprog;
extern          int                     top_affect;
extern          int                     top_area;
extern          int                     top_ed;
extern          int                     top_exit;
extern          int                     top_help;
extern          int                     top_mob_index;
extern          int                     top_obj_index;
extern          int                     top_reset;
extern          int                     top_room;
extern          int                     top_shop;
extern          int                     top_clan;

extern          int                     top_vnum_mob;
extern          int                     top_vnum_obj;
extern          int                     top_vnum_room;

extern          char                    str_empty       [1];

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

/* act_comm.c */
void add2queue          args ( ( CHAR_DATA *ch, CHAR_DATA *victim, char * argument) );
void add2tell           args ( ( CHAR_DATA *ch, CHAR_DATA *victim, char * argument) );
void add2last           args ( ( char * argument, CHAR_DATA *ch ) );
void add2last_imm       args ( ( char * argument, CHAR_DATA *ch ) );

/* act_wiz.c */
/*
ROOM_INDEX_DATA *find_location( CHAR_DATA *ch, char *arg );
*/
/* db.c */
void    reset_area      args( ( AREA_DATA * pArea ) );
void    reset_room      args( ( ROOM_INDEX_DATA *pRoom ) );

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

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

/* special.c */
char *  spec_string     args( ( SPEC_FUN *fun ) );      /* OLC */

/* clan.c */
CLAN_DATA  * get_clan           args ( ( int clannum ) );  

/* bit.c */
extern const struct flag_type   area_flags[];
extern const struct flag_type   sex_flags[];
extern const struct flag_type   exit_flags[];
extern const struct flag_type   door_resets[];
extern const struct flag_type   room_flags[];
extern const struct flag_type   sector_flags[];
extern const struct flag_type   type_flags[];
extern const struct flag_type   extra_flags[];
extern const struct flag_type   wear_flags[];
extern const struct flag_type   act_flags[];
extern const struct flag_type   affect_flags[];
extern const struct flag_type   apply_flags[];
extern const struct flag_type   wear_loc_strings[];
extern const struct flag_type   wear_loc_flags[];
extern const struct flag_type   weapon_flags[];
extern const struct flag_type   container_flags[];
extern const struct flag_type   liquid_flags[];
extern const struct flag_type   mprog_type_flags[];

/* ROM OLC: */

extern const struct flag_type   material_type[];
extern const struct flag_type   form_flags[];
extern const struct flag_type   part_flags[];
extern const struct flag_type   ac_type[];
extern const struct flag_type   size_flags[];
extern const struct flag_type   off_flags[];
extern const struct flag_type   imm_flags[];
extern const struct flag_type   res_flags[];
extern const struct flag_type   vuln_flags[];
extern const struct flag_type   position_flags[];
extern const struct flag_type   weapon_class[];
extern const struct flag_type   weapon_type[];

/*   Added by EmberMUD */

extern const struct flag_type   raffect_type[];
extern const struct flag_type   rafdam_type[];
extern const struct flag_type   clan_flags[];
extern const struct flag_type   clan_join_flags[];
extern const struct flag_type   rnd_obj_flags[];

struct rand_bag_material
{
   char *  name;
   bool    isprefix;       /* before or after the type.name? */
   sh_int  size;           /* is the material big or small? */
};

struct rand_bag_type
{
   char *  name;
   sh_int  capacity;       /* big or small? */
   long    wear_loc;       /* can it be worn? */
};

/* struct rand_light_type
 * {
 *  char *  name;
 *  sh_int  duration;       
 * };
 */

struct rand_weapon_type
{
   char *  name;
   sh_int  magic_mod;
   sh_int  damage_mod;
   sh_int  weapon_type;
};

struct rand_armor_type 
{
   char *  name;           
   sh_int  wearloc;                
   sh_int  protect_mod;    /* + or - AC ? */
   sh_int  magic_mod;      /* better or worse for magic? */
   sh_int  p_type;
};

struct rand_item_material
{
   char *  name;
   sh_int  coolness;       /* better AC for armor, better damroll for weapons, etc. */
   sh_int  magic_mod;      
   sh_int  level;  /* level where this material is normal (i.e. iron is 1, dilithium is 80, etc.) */
};

struct rand_ring_type
{
   char * name;
   sh_int coolness;        /* "exquisite gold" rings are cooler than "dirty copper" */
   long   extra_flags;     /* if it's "glowing" set it to glow, etc. */
};

/*****************************************************************************
 *                                 OLC END                                   *
 *****************************************************************************/

/*************************
 * Mob Programs Funcs    *
 *************************/

/* act_wiz.c */
ROOM_INDEX_DATA *       find_location   args( ( CHAR_DATA *ch, char *arg ) );

/* fight.c */
void                    death_cry       args( ( CHAR_DATA *ch ) );
int     hit_xp_compute  args( ( CHAR_DATA *gch, CHAR_DATA *victim, 
			    int total_levels, int members, int dam ) );
int     cast_xp_compute args( ( CHAR_DATA *gch, CHAR_DATA *victim, 
			    int total_levels, int members, int dam ) );

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

void    mprog_wordlist_check    args ( ( char * arg, CHAR_DATA *mob,
					CHAR_DATA* actor, OBJ_DATA* object,
					void* vo, int type ) );
void    mprog_percent_check     args ( ( CHAR_DATA *mob, CHAR_DATA* actor,
					OBJ_DATA* object, void* vo,
					int type ) );
void    mprog_act_trigger       args ( ( char* buf, CHAR_DATA* mob,
					CHAR_DATA* ch, OBJ_DATA* obj,
					void* vo ) );
void    mprog_bribe_trigger     args ( ( CHAR_DATA* mob, CHAR_DATA* ch,
					int amount ) );
void    mprog_entry_trigger     args ( ( CHAR_DATA* mob ) );
void    mprog_give_trigger      args ( ( CHAR_DATA* mob, CHAR_DATA* ch,
					OBJ_DATA* obj ) );
void    mprog_greet_trigger     args ( ( CHAR_DATA* mob ) );
void    mprog_fight_trigger     args ( ( CHAR_DATA* mob, CHAR_DATA* ch ) );
void    mprog_hitprcnt_trigger  args ( ( CHAR_DATA* mob, CHAR_DATA* ch ) );
void    mprog_death_trigger     args ( ( CHAR_DATA* mob ) );
void    mprog_random_trigger    args ( ( CHAR_DATA* mob ) );
void    mprog_speech_trigger    args ( ( char* txt, CHAR_DATA* mob ) );
/* added by Zak */
bool    mprog_command_trigger   args ( ( char* txt, CHAR_DATA* ch  ) );

/* room progs */
void    rprog_act_trigger       args ( ( char *buf, ROOM_INDEX_DATA *room, 
				    CHAR_DATA *ch, OBJ_DATA *obj, void *vo ) );
void    rprog_leave_trigger     args ( ( CHAR_DATA *ch ) );
void    rprog_enter_trigger     args ( ( CHAR_DATA *ch ) );
void    rprog_sleep_trigger     args ( ( CHAR_DATA *ch ) );
void    rprog_rest_trigger      args ( ( CHAR_DATA *ch ) );
void    rprog_rfight_trigger    args ( ( CHAR_DATA *ch ) );
void    rprog_death_trigger     args ( ( CHAR_DATA *ch ) );
void    rprog_speech_trigger    args ( ( char *txt, CHAR_DATA *ch ) );
void    rprog_random_trigger    args ( ( CHAR_DATA *ch ) );

/* object progs */
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 *vo );
void oprog_remove_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_sac_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_zap_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_get_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_examine_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_greet_trigger( CHAR_DATA *ch );
void oprog_act_trigger( char *buf, OBJ_DATA *mobj, CHAR_DATA *ch,
			OBJ_DATA *obj, void *vo );
char *oprog_type_to_name( int type );

#endif