/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
#include "status.h"
#define exit(a) if (fBootDb && ((a) == STATUS_ERROR)) \
exit (STATUS_BOOT_ERROR); else exit (a)
#define is_digit(a) (((a) >= '0') && ((a) <= '9'))
#define sbug(a) bug (a,0)
/*
* Accommodate old non-Ansi compilers.
*/
#if defined(TRADITIONAL)
#define const
#define args( list ) ( )
#define DECLARE_DO_FUN( fun ) void fun( )
#define DECLARE_SPEC_FUN( fun ) bool fun( )
#define DECLARE_SPELL_FUN( fun ) void fun( )
#else
#define args( list ) list
#define DECLARE_DO_FUN( fun ) DO_FUN fun
#define DECLARE_SPEC_FUN( fun ) SPEC_FUN fun
#define DECLARE_SPELL_FUN( fun ) SPELL_FUN fun
#endif
/* system calls */
int unlink();
int system();
/*
* Short scalar types.
* Diavolo reports AIX compiler has bugs with short types.
*/
#if !defined(FALSE)
#define FALSE 0
#endif
#if !defined(TRUE)
#define TRUE 1
#endif
#if defined(_AIX)
#if !defined(const)
#define const
#endif
typedef int sh_int;
typedef int bool;
#define unix
#else
/*typedef short int sh_int;*/
typedef int sh_int;
typedef unsigned char bool;
#endif
typedef unsigned char byte;
/*
* Structure types.
*/
typedef struct affect_data AFFECT_DATA;
typedef struct ban_data BAN_DATA;
typedef struct char_data CHAR_DATA;
typedef struct room_data ROOM_DATA;
typedef struct level_data LEVEL_DATA;
typedef struct descriptor_data DESCRIPTOR_DATA;
typedef struct help_data HELP_DATA;
typedef struct note_data NOTE_DATA;
typedef struct obj_data OBJ_DATA;
typedef struct obj_index_data OBJ_INDEX_DATA;
typedef struct pc_data PC_DATA;
typedef struct time_info_data TIME_INFO_DATA;
typedef struct social_type SOCIAL_TYPE;
typedef struct god_type GOD_TYPE;
typedef struct account_data ACCOUNT_DATA;
typedef struct top_data TOP_DATA;
/*
* Function types.
*/
typedef void DO_FUN args( ( CHAR_DATA *ch, char *argument ) );
typedef bool SPEC_FUN args( ( CHAR_DATA *ch ) );
typedef void SPELL_FUN args( ( int sn, int level, CHAR_DATA *ch, void *vo ) );
/*
* String and memory management parameters.
*/
#define MAX_KEY_HASH 1024
#define MAX_STRING_LENGTH 4096
#define MAX_INPUT_LENGTH 256
#define PAGELEN 22
#define MAX_INT 32768
#define VALID_VALUE 82 /* some exact number to avoid accidental
validation due to memory corruption */
/*
* Game parameters.
* Increase the max'es if you add more of something.
* Adjust the pulse numbers to suit yourself.
*/
#define MAX_SOCIALS 256
#define MAX_IN_GROUP 15
#define MAX_TRUST 10
#define MAX_NUMBER_CARRY 15
#define HIT_POINTS_MORTAL 6666
#define HIT_POINTS_IMMORTAL 1000000
#define NUM_TOP 10
#define LD_TICKS 30
#define PULSE_PER_SECOND 4
#define PULSE_OBJECTS ( 1 * PULSE_PER_SECOND)
#define PULSE_VIOLENCE ( 1 * PULSE_PER_SECOND)
#define PULSE_TICK (10 * PULSE_PER_SECOND)
#define PULSE_SAVE (200 * PULSE_PER_SECOND)
/*
* Site ban structure.
*/
struct ban_data
{
BAN_DATA * next;
char name[MAX_INPUT_LENGTH];
char reason[MAX_INPUT_LENGTH];
};
struct time_info_data
{
int hour;
int day;
int month;
int year;
};
/*
* Connected state for a channel.
*/
#define CON_PLAYING 0
#define CON_RESOLVE_ADDRESS 1
#define CON_GET_ANSI 2
#define CON_GET_NAME 3
#define CON_GET_OLD_PASSWORD 4
#define CON_GET_ACCNT_PASS 5
#define CON_GET_ACCNT_PASS_ADDING 6
#define CON_GET_NEW_ACCOUNT 7
#define CON_CONFIRM_NEW_NAME 8
#define CON_GET_ADMIN_PASS 9
#define CON_GET_NEW_PASSWORD 10
#define CON_CONFIRM_NEW_PASSWORD 11
#define CON_GET_ADMIN_CHAR_NAME 12
#define CON_GET_NEW_SEX 13
#define CON_DEFAULT_CHOICE 15
#define CON_READ_IMOTD 16
#define CON_READ_MOTD 17
#define CON_BREAK_CONNECT 18
#define COUNT_WEAPONS 0
#define COUNT_ARMOR 1
#define COUNT_EXPLOSIVES 2
#define COUNT_AMMO 3
#define COUNT_MISC 4
#define NUM_COUNTS 5
#define ITEM_MISC 0
#define ITEM_WEAPON 1
#define ITEM_ARMOR 2
#define ITEM_EXPLOSIVE 3
#define ITEM_AMMO 4
#define ITEM_TEAM_VEHICLE 5
#define ITEM_TEAM_ENTRANCE 6
/* ammo types */
#define AMMO_9MM 0
#define AMMO_GREN_LAUNCHER 6
#define AMMO_FLARE 13
#define AMMO_TANK_GUN 14
/* general flags */
#define GEN_CAN_BURY (B)
#define GEN_BURNS_ROOM (D)
#define GEN_DETECT_MINE (G)
#define GEN_ANTI_BLIND (H)
#define GEN_DARKS_ROOM (J)
#define GEN_EXTRACT_ON_IMPACT (K)
#define GEN_SEE_IN_DARK (L)
/* extract flags */
#define EXTRACT_EXPLODE_ON_EXTRACT (A)
#define EXTRACT_BLIND_ON_EXTRACT (B)
#define EXTRACT_BURN_ON_EXTRACT (C)
#define EXTRACT_STUN_ON_EXTRACT (D)
#define EXTRACT_DARK_ON_EXTRACT (E)
/* usage flags */
#define USE_HEAL (A)
#define USE_EVAC (D)
#define USE_MAKE_DROID (E)
#define USE_MAKE_SEEKER_DROID (F)
/* search types */
#define SEARCH_ITEM_TYPE 0
#define SEARCH_GEN_FLAG 1
#define SEARCH_AMMO_TYPE 2
/* some common objects */
#define VNUM_GRENADE 1
#define VNUM_9MM_CLIP 2
#define VNUM_9MM_PISTOL 3
#define VNUM_FIRE 5
#define VNUM_NAPALM 6
#define VNUM_HQ 7
#define VNUM_DARK 24
/*
* Descriptor (channel) structure.
*/
struct descriptor_data
{
DESCRIPTOR_DATA * next;
DESCRIPTOR_DATA * snoop_by;
CHAR_DATA * character;
CHAR_DATA * original;
GOD_TYPE *adm_data;
unsigned int time;
pid_t host_lookup_pid;
char host[80];
sh_int descriptor;
sh_int connected;
int wait;
bool fcommand;
char inbuf [4 * MAX_INPUT_LENGTH];
char incomm [MAX_INPUT_LENGTH];
char inlast [MAX_INPUT_LENGTH];
int repeat;
char * outbuf;
int outsize;
int outtop;
int max_out;
char * showstr_head;
char * showstr_point;
};
/* allocation validation structure */
struct allocations_type
{
void *ptr;
int size;
char *filename;
int line_num;
struct allocations_type *next;
};
struct god_type
{
char *rl_name;
sh_int trust;
char *game_names;
char *password;
char *room_name;
int honorary;
};
struct account_data
{
char *login;
char *password;
char *character;
struct account_data *next;
};
struct top_data
{
char *name;
int kills;
};
/*
* TO types for act.
*/
#define TO_ROOM 0
#define TO_NOTVICT 1
#define TO_VICT 2
#define TO_CHAR 3
/* raw proportion (out of 1k) of kp to be transfered before tax */
#define KILL_TRANSFER_PROPORTION 2
#define KP_BADASS 1500
/*
* Help table types.
*/
struct help_data
{
HELP_DATA * next;
sh_int level;
char * keyword;
char * text;
};
/*
* Data structure for notes.
*/
struct note_data
{
NOTE_DATA * next;
char * sender;
char * date;
char * to_list;
char * subject;
char * text;
time_t date_stamp;
};
/* RT ASCII conversions -- used so we can have letters in this file */
#define A 1
#define B 2
#define C 4
#define D 8
#define E 16
#define F 32
#define G 64
#define H 128
#define I 256
#define J 512
#define K 1024
#define L 2048
#define M 4096
#define N 8192
#define O 16384
#define P 32768
#define Q 65536
#define R 131072
#define S 262144
#define T 524288
#define U 1048576
#define V 2097152
#define W 4194304
#define X 8388608
#define Y 16777216
#define Z 33554432
#define aa 67108864 /* doubled due to conflicts */
#define bb 134217728
#define cc 268435456
#define dd 536870912
#define ee 1073741824
/* mob behaviors */
#define BEHAVIOR_LD 0
#define BEHAVIOR_GUARD 1
#define BEHAVIOR_SEEK 2
#define BEHAVIOR_WANDER 3
#define BEHAVIOR_PILLBOX 4
#define BEHAVIOR_SEEKING_PILLBOX 5
#define BEHAVIOR_PLAYER_CONTROL 6
#define LIFETIME_SMOKE 100
/*
* Bits for 'affected_by'.
* Used in #MOBILES.
*/
#define AFF_BLIND (A)
#define AFF_DAZE (B)
/*
* Sex.
* Used in #MOBILES.
*/
#define SEX_NEUTRAL 0
#define SEX_MALE 1
#define SEX_FEMALE 2
/* dice */
#define DICE_NUMBER 0
#define DICE_TYPE 1
#define DICE_BONUS 2
/*
* Wear flags.
* Used in #OBJECTS.
*/
#define ITEM_TAKE (A)
#define ITEM_WEAR_FINGER (B)
#define ITEM_WEAR_NECK (C)
#define ITEM_WEAR_BODY (D)
#define ITEM_WEAR_HEAD (E)
#define ITEM_WEAR_LEGS (F)
#define ITEM_WEAR_FEET (G)
#define ITEM_WEAR_HANDS (H)
#define ITEM_WEAR_ARMS (I)
#define ITEM_WEAR_SHIELD (J)
#define ITEM_WEAR_ABOUT (K)
#define ITEM_WEAR_WAIST (L)
#define ITEM_WEAR_WRIST (M)
#define ITEM_WIELD (N)
#define ITEM_HOLD (O)
#define ITEM_TWO_HANDS (P)
/*
* Room flags.
* Used in #ROOMS.
*/
#define ROOM_DARK (A)
#define ROOM_TANK (B)
#define ROOM_CONNECTED (C)/* used at boot to guarantee connectivity */
#define ROOM_PRIVATE (J)
#define ROOM_SAFE (K)
#define ROOM_SOLITARY (L)
#define ROOM_GODS_ONLY (P)
#define ROOM_NEWBIES_ONLY (R)
/*
* Directions.
* Used in #ROOMS.
*/
#define DIR_NORTH 0
#define DIR_EAST 1
#define DIR_SOUTH 2
#define DIR_WEST 3
#define DIR_UP 4
#define DIR_DOWN 5
/*
* Exit flags.
* Used in #ROOMS.
*/
#define EX_ISDOOR (A)
#define EX_CLOSED (B)
#define EX_LOCKED (C)
#define EX_ISWALL (D)
#define EX_ISNOBREAKWALL (E)
#define EX_ISNOBREAKDOOR (F)
#define EX_ISNOLOCKDOOR (G)
#define EX_ISNOUNLOCKDOOR (H)
/*
* Equpiment wear locations.
* Used in #RESETS.
*/
#define WEAR_NONE -1
#define WEAR_LIGHT 0
#define WEAR_FINGER_L 1
#define WEAR_FINGER_R 2
#define WEAR_NECK_1 3
#define WEAR_NECK_2 4
#define WEAR_BODY 5
#define WEAR_HEAD 6
#define WEAR_LEGS 7
#define WEAR_FEET 8
#define WEAR_HANDS 9
#define WEAR_ARMS 10
#define WEAR_SHIELD 11
#define WEAR_ABOUT 12
#define WEAR_WAIST 13
#define WEAR_WRIST_L 14
#define WEAR_WRIST_R 15
#define WEAR_WIELD 16
#define WEAR_HOLD 17
#define MAX_WEAR 18
/***************************************************************************
* *
* VALUES OF INTEREST TO AREA BUILDERS *
* (End of this section ... stop here) *
* *
***************************************************************************/
/*
* Positions.
*/
#define POS_DEAD 0
#define POS_MORTAL 1
#define POS_INCAP 2
#define POS_STUNNED 3
#define POS_SLEEPING 4
#define POS_RESTING 5
#define POS_SITTING 6
#define POS_FIGHTING 7
#define POS_STANDING 8
/*
* ACT bits for players.
*/
#define PLR_AGGRO_ALL (L)
#define PLR_HOLYLIGHT (N)
#define PLR_WIZINVIS (O)
#define PLR_NOLEADER (P)
#define PLR_LOG (W)
#define PLR_DENY (X)
#define PLR_FREEZE (Y)
/*temp flags*/
/*tank flags*/
#define IN_TANK (A)
#define MAN_SHIELD (B)
#define MAN_TURRET (C)
#define MAN_DRIVE (D)
#define TRAITOR (E)
/* RT comm flags -- may be used on both mobs and chars */
#define COMM_QUIET (A)
#define COMM_NOWIZ (B)
#define COMM_NOIMP (C)
#define COMM_NOBOUNTY (F)
#define COMM_NOKILLS (G)
/* 4 channels reserved, H-K */
/* display flags */
#define COMM_COMPACT (L)
#define COMM_BRIEF (M)
#define COMM_PROMPT (N)
#define COMM_COMBINE (O)
#define COMM_TELNET_GA (P)
/* 3 flags reserved, Q-S */
/* penalties */
#define COMM_NOEMOTE (T)
#define COMM_NOSHOUT (U)
#define COMM_NOTELL (V)
#define COMM_NOCHANNELS (W)
struct level_data
{
sh_int num_levels;
sh_int level_number;
sh_int x_size;
sh_int y_size;
sh_int reference_x;/* x,y coordinates of room directly below*/
sh_int reference_y;/* the reference from the previous level */
ROOM_DATA * rooms_on_level;
LEVEL_DATA * level_down;
LEVEL_DATA * level_up;
};
struct room_data
{
CHAR_DATA * people;
OBJ_DATA * contents;
OBJ_DATA * mine;
LEVEL_DATA * this_level;
OBJ_DATA * interior_of;
CHAR_DATA * inside_mob;
long exit[6];
long room_flags;
int x, y, level;
char * name;
char * description;
};
/*
* One character (PC or NPC).
*/
struct char_data
{
CHAR_DATA * next;
CHAR_DATA * next_in_room;
CHAR_DATA * next_extract;
CHAR_DATA * leader;
CHAR_DATA * fighting;
CHAR_DATA * chasing;
CHAR_DATA * reply;
CHAR_DATA * last_hit_by;
CHAR_DATA * owner;
SPEC_FUN * spec_fun;
DESCRIPTOR_DATA * desc;
NOTE_DATA * pnote;
OBJ_DATA * carrying;
ROOM_DATA * in_room;
ROOM_DATA * interior;
PC_DATA * pcdata;
int allows_followers;
char *kill_msg;
char *names;
char *where_start;
sh_int valid; /* added for debugging purposes */
sh_int move_delay;
sh_int carry_number;
sh_int carry_weight;
sh_int ld_behavior;
char *short_descript;
sh_int sex;
sh_int trust;
byte color;
int played;
int lines; /* for the pager */
time_t logon;
time_t last_note;
time_t last_fight;
sh_int timer;
sh_int wait;
int kills, deaths;
int hit;
int max_hit;
long act, temp_flags;
long comm; /* RT added to pad the vector */
sh_int invis_level;
sh_int armor;
int affected_by;
sh_int position;
sh_int start_pos;
sh_int donate_num;
int chan_delay;
int report;
int ld_timer;
int turret_dir, shield_dir; /* used only for tanks */
};
/*
* Data which only PC's have.
*/
struct pc_data
{
PC_DATA * next;
char *password;
char *poofin_msg;
char *poofout_msg;
char *title_line;
char *account;
int solo_hit;
bool confirm_delete;
byte color_action;
byte color_combat_condition_s;
byte color_combat_condition_o;
byte color_xy;
byte color_wizi;
byte color_hp;
byte color_combat_o;
byte color_level;
byte color_exits;
byte color_desc;
byte color_obj;
byte color_say;
byte color_tell;
byte color_reply;
};
struct obj_index_data
{
/* OBJ_INDEX_DATA * next;*/
char * name;
char * short_descr;
char * description;
char * explode_desc;
sh_int vnum;
int hp_struct;
int hp_char;
sh_int item_type;
sh_int count;
sh_int prob_in, number_to_put_in;
int extract_flags, general_flags, usage_flags;
sh_int wear_flags;
sh_int ammo_type;
sh_int burn_time;
sh_int ammo;
sh_int weight;
sh_int range;
sh_int rounds_per_second;
sh_int armor;
sh_int damage_char[3]; /* 0. direct 1. in room 2. 1 away */
sh_int damage_structural[3];
};
/*
* One object.
*/
struct obj_data
{
OBJ_DATA * next;
OBJ_DATA * next_content;
OBJ_DATA * contains;
OBJ_DATA * in_obj;
CHAR_DATA * carried_by;
OBJ_INDEX_DATA * pIndexData;
ROOM_DATA * in_room;
CHAR_DATA * owner;
char * name;
char * short_descr;
char * description;
char * explode_desc;
sh_int valid; /* added for debugging purposes */
sh_int item_type;
sh_int vnum;
int extract_flags, general_flags, usage_flags;
int hp_struct;
int hp_char;
sh_int extract_me;
sh_int wear_flags;
sh_int wear_loc;
sh_int weight;
sh_int timer;
sh_int range;
sh_int rounds_per_second;
sh_int armor;
sh_int arrival_time;
sh_int ammo;
sh_int ammo_type;
sh_int wait_time;
sh_int dir_facing;
sh_int burn_time;
ROOM_DATA * destination;
ROOM_DATA * interior; /* tank or plane interior */
sh_int damage_char[3]; /* 0. direct 1. in room 2. 1 away */
sh_int damage_structural[3];
};
/*
* Utility macros.
*/
#define UMIN(a, b) ((a) < (b) ? (a) : (b))
#define UMAX(a, b) ((a) > (b) ? (a) : (b))
#define URANGE(a, b, c) ((b) < (a) ? (a) : ((b) > (c) ? (c) : (b)))
#define LOWER(c) ((c) >= 'A' && (c) <= 'Z' ? (c)+'a'-'A' : (c))
#define UPPER(c) ((c) >= 'a' && (c) <= 'z' ? (c)+'A'-'a' : (c))
#define IS_SET(flag, bit) ((flag) & (bit))
#define SET_BIT(var, bit) ((var) |= (bit))
#define REMOVE_BIT(var, bit) ((var) &= ~(bit))
/*
* Character macros.
*/
#define IS_NPC(ch) (((ch)->pcdata == NULL))
#define IS_IMMORTAL(ch) (get_trust(ch))
#define IS_HERO(ch) (get_trust(ch))
#define IS_IMP(ch) (get_trust(ch) == MAX_TRUST)
#define IS_TRUSTED(ch,level) (get_trust(ch))
#define GET_AGE(ch) ((int) (17 + ((ch)->played \
+ current_time - (ch)->logon )/72000))
#define IS_AWAKE(ch) (ch->position > POS_SLEEPING)
#define WAIT_STATE(ch, npulse) ((ch)->wait = UMAX((ch)->wait, (npulse)))
#define DESC_WAIT_STATE(d, npulse) ((d)->wait = UMAX((d)->wait, (npulse)))
/*
* Object macros.
*/
#define CAN_WEAR(obj, part) (IS_SET((obj)->wear_flags, (part)))
#define IS_OBJ_STAT(obj, stat) (IS_SET((obj)->extra_flags, (stat)))
#define IS_WEAPON_STAT(obj,stat)(IS_SET((obj)->value[4],(stat)))
/*
* Description macros.
*/
#define PERS(ch, looker) ( can_see( looker, (ch) ) ? \
( IS_NPC(ch) ? (ch)->short_descript \
: (ch)->names ) : "someone" )
/*
* Structure for a social in the socials table.
*/
struct social_type
{
char * name;
char * char_no_arg;
char * others_no_arg;
char * char_found;
char * others_found;
char * vict_found;
char * char_not_found;
char * char_auto;
char * others_auto;
};
/*
* Global constants.
*/
extern struct social_type social_table[MAX_SOCIALS];
extern const struct god_type imp_table[];
/*
* Global variables.
*/
extern HELP_DATA * help_first;
extern BAN_DATA * ban_list;
extern BAN_DATA * nban_list;
extern CHAR_DATA * char_list;
extern DESCRIPTOR_DATA * descriptor_list;
extern NOTE_DATA * note_list;
extern OBJ_DATA * object_list;
extern OBJ_DATA * object_list;
extern OBJ_INDEX_DATA * all_objects;
extern LEVEL_DATA * the_city;
extern BAN_DATA * ban_free;
extern CHAR_DATA * char_free;
extern DESCRIPTOR_DATA * descriptor_free;
extern NOTE_DATA * note_free;
extern OBJ_DATA * obj_free;
extern PC_DATA * pcdata_free;
extern char bug_buf [];
extern time_t current_time;
extern bool fLogAll;
extern FILE * fpReserve;
extern char log_buf [];
extern TIME_INFO_DATA time_info;
extern sh_int team_choice;
extern sh_int teleport_time;
extern int tick_counter;
extern int expansions;
extern int ground0_down;
extern ROOM_DATA *ammo_repop[3];
extern ROOM_DATA *safe_area, *someimp_area;
extern ROOM_DATA *god_general_area;
extern ROOM_DATA *explosive_area;
extern ROOM_DATA *store_area;
extern int game_seed;
extern int boot_seed;
extern GOD_TYPE *god_table;
extern int iteration;
extern CHAR_DATA *next_violence;
extern int max_on;
extern CHAR_DATA *enforcer;
extern CHAR_DATA *pill_box;
extern CHAR_DATA *guardian;
extern CHAR_DATA *tank_mob;
extern ACCOUNT_DATA *accounts_list;
extern TOP_DATA top_players_kills[NUM_TOP];
extern CHAR_DATA *extract_list;
extern int expand_event;
extern bool fBootDb;
/*
* OS-dependent declarations.
* These are all very standard library functions,
* but some systems have incomplete or non-ansi header files.
*/
#define NOCRYPT
#if defined(_AIX)
char * crypt args( ( const char *key, const char *salt ) );
#endif
#if defined(apollo)
int atoi args( ( const char *string ) );
void * calloc args( ( unsigned nelem, size_t size ) );
char * crypt args( ( const char *key, const char *salt ) );
#endif
#if defined(hpux)
char * crypt args( ( const char *key, const char *salt ) );
#endif
#if defined(linux)
char * crypt args( ( const char *key, const char *salt ) );
#endif
#if defined(macintosh)
#define NOCRYPT
#if defined(unix)
#undef unix
#endif
#endif
#if defined(MIPS_OS)
char * crypt args( ( const char *key, const char *salt ) );
#endif
#if defined(MSDOS)
#define NOCRYPT
#if defined(unix)
#undef unix
#endif
#endif
#if defined(NeXT)
char * crypt args( ( const char *key, const char *salt ) );
#endif
#if defined(sequent)
char * crypt args( ( const char *key, const char *salt ) );
int fclose args( ( FILE *stream ) );
int fprintf args( ( FILE *stream, const char *format, ... ) );
int fread args( ( void *ptr, int size, int n, FILE *stream ) );
int fseek args( ( FILE *stream, long offset, int ptrname ) );
void perror args( ( const char *s ) );
int ungetc args( ( int c, FILE *stream ) );
#endif
#if defined(sun)
char * crypt args( ( const char *key, const char *salt ) );
int fclose args( ( FILE *stream ) );
int fprintf args( ( FILE *stream, const char *format, ... ) );
#if defined(SYSV)
siz_t fread args( ( void *ptr, size_t size, size_t n,
FILE *stream) );
#else
/* int fread args( ( void *ptr, int size, int n, FILE *stream ) );*/
#endif
int fseek args( ( FILE *stream, long offset, int ptrname ) );
void perror args( ( const char *s ) );
int ungetc args( ( int c, FILE *stream ) );
#endif
#if defined(ultrix)
char * crypt args( ( const char *key, const char *salt ) );
#endif
/*
* The crypt(3) function is not available on some operating systems.
* In particular, the U.S. Government prohibits its export from the
* United States to foreign countries.
* Turn on NOCRYPT to keep passwords in plain text.
*/
#if defined(NOCRYPT)
#define crypt(s1, s2) (s1)
#endif
/*
* Data files used by the server.
*
* AREA_LIST contains a list of areas to boot.
* All files are read in completely at bootup.
* Most output files (bug, idea, typo, shutdown) are append-only.
*
* The NULL_FILE is held open so that we have a stream handle in reserve,
* so players can go ahead and telnet to all the other descriptors.
* Then we close it whenever we need to open a file (e.g. a save file).
*/
#if defined(unix)
#define PLAYER_DIR "../player/" /* Player files */
#define BAK_PLAYER_DIR "../player/bak/" /* deleted player files */
#define PLAYER_TEMP "../player/temp"
#define GOD_DIR "../gods/" /* list of gods */
#define NULL_FILE "/dev/null" /* To reserve one stream */
#define BOOT_DIR "../boot/"
#define ACCOUNTS_FILE "../boot/accounts.boot" /* account list */
#define TOP_FILE "../boot/top.boot" /* account list */
#endif
#define BOOT_LIST "files.boot" /* List of boot files */
#define BAN_LIST "ban.boot" /* List of banned sites */
#define NBAN_LIST "nban.boot" /* List of banned sites */
#define BUG_FILE "../boot/bugs.txt" /* For 'bug' and bug( ) */
#define IDEA_FILE "../boot/ideas.txt" /* For 'idea' */
#define TYPO_FILE "../boot/typos.txt" /* For 'typo' */
#define NOTE_FILE "../boot/notes.txt" /* For 'notes' */
#define SHUTDOWN_FILE "../boot/shutdown.txt" /* For 'shutdown' */
#define REBOOT_FILE "../boot/reboot.txt" /* For 'reboot' */
/*
* Our function prototypes.
* One big lump ... this is every function in Merc.
*/
#define CD CHAR_DATA
#define OD OBJ_DATA
#define OID OBJ_INDEX_DATA
#define RD ROOM_DATA
#define SF SPEC_FUN
/* act_comm.c */
bool is_note_to args( ( CHAR_DATA *ch, NOTE_DATA *pnote ) );
void check_sex args( ( CHAR_DATA *ch) );
void add_follower args( ( CHAR_DATA *ch, CHAR_DATA *master ) );
void stop_follower args( ( CHAR_DATA *ch ) );
void nuke_pets args( ( CHAR_DATA *ch ) );
void die_follower args( ( CHAR_DATA *ch ) );
bool is_same_group args( ( CHAR_DATA *ach, CHAR_DATA *bch ) );
/* act_info.c */
void set_title args( ( CHAR_DATA *ch, char *title ) );
int get_num_rank (CHAR_DATA *ch);
char *get_rank (CHAR_DATA *ch);
int is_leader (CHAR_DATA *ch);
/* act_move.c */
void move_char args( ( CHAR_DATA *ch, int door, bool follow ) );
ROOM_DATA* get_to_room args( ( ROOM_DATA *curr_room, sh_int door));
ROOM_DATA* index_room args( ( ROOM_DATA *curr_room, sh_int x, sh_int y));
void complete_movement (CHAR_DATA *ch);
/* act_obj.c */
bool can_loot args( (CHAR_DATA *ch, OBJ_DATA *obj) );
void get_obj args( ( CHAR_DATA *ch, OBJ_DATA *obj,
OBJ_DATA *container ) );
CHAR_DATA *owner_objective (int num);
/* act_wiz.c */
/* comm.c */
void show_string args( ( struct descriptor_data *d, char *input) );
void close_socket args( ( DESCRIPTOR_DATA *dclose ) );
void write_to_buffer args( ( DESCRIPTOR_DATA *d, const char *txt,
int length ) );
void send_to_char args( ( const char *txt, CHAR_DATA *ch ) );
void page_to_char args( ( const char *txt, CHAR_DATA *ch ) );
void act args( ( const char *format, CHAR_DATA *ch,
const void *arg1, const void *arg2, int type ) );
void act_new args( ( const char *format, CHAR_DATA *ch,
const void *arg1, const void *arg2, int type,
int min_pos) );
/* db.c */
void boot_db args( ( void ) );
void area_update args( ( void ) );
OD * create_object args( ( OBJ_INDEX_DATA *pObjIndex, int level ) );
void clone_object args( ( OBJ_DATA *parent, OBJ_DATA *clone ) );
void clear_char args( ( CHAR_DATA *ch ) );
void free_char args( ( CHAR_DATA *ch ) );
OID * get_obj_index args( ( int vnum ) );
char fread_letter args( ( FILE *fp ) );
int fread_number args( ( FILE *fp ) );
long fread_flag args( ( FILE *fp ) );
char * fread_string args( ( FILE *fp ) );
char * fread_string_eol args(( FILE *fp ) );
void fread_to_eol args( ( FILE *fp ) );
char * fread_word args( ( FILE *fp ) );
long flag_convert args( ( char letter) );
void mark_alloc (void *ptr, int size, struct allocations_type **first_alloc,
char *filename, int line_num);
void mark_free (void *ptr, struct allocations_type **first_alloc,
char *filename, int line_num);
struct allocations_type *get_mem_reference (void *ptr,
struct allocations_type **first_alloc);
int size_correct (void *ptr, int size, struct allocations_type **first_alloc);
#define alloc_mem(sMem) f_alloc_mem (sMem, __FILE__, __LINE__)
#define alloc_perm(sMem) f_alloc_perm (sMem, __FILE__, __LINE__)
#define free_mem(pMem, sMem) f_free_mem (pMem, sMem, __FILE__, __LINE__)
#define str_dup(str) f_str_dup (str, __FILE__, __LINE__)
#define really_str_dup(str) f_really_str_dup (str, __FILE__, __LINE__)
#define free_string(pstr) f_free_string (pstr, __FILE__, __LINE__)
void * f_alloc_mem args( ( int sMem, char *filename, int line_num ) );
void * f_alloc_perm args( ( int sMem, char *filename, int line_num ) );
void f_free_mem args( ( void *pMem, int sMem, char *filename,
int line_num ) );
char * f_str_dup args( ( const char *str, char *filename,
int line_num) );
char * f_really_str_dup args( ( const char *str, char *filename,
int line_num) );
void f_free_string args( ( char *pstr, char *filename, int line_num) );
int number_fuzzy args( ( int number ) );
int number_range args( ( int from, int to ) );
int number_percent args( ( void ) );
int number_door args( ( void ) );
int number_bits args( ( int width ) );
int number_mm args( ( void ) );
int dice args( ( int number, int size ) );
int interpolate args( ( int level, int value_00, int value_32 ) );
void smash_tilde args( ( char *str ) );
bool str_cmp args( ( const char *astr, const char *bstr ) );
bool str_prefix args( ( const char *astr, const char *bstr ) );
bool str_infix args( ( const char *astr, const char *bstr ) );
bool str_suffix args( ( const char *astr, const char *bstr ) );
char * capitalize args( ( const char *str ) );
void append_file args( ( CHAR_DATA *ch, char *file, char *str ) );
void bug args( ( const char *str, int param ) );
void log_string (char *str, ...);
void tail_chain args( ( void ) );
void expand_city ();
void load_accounts (FILE *fp);
/* fight.c */
bool is_safe args( (CHAR_DATA *ch, CHAR_DATA *victim ) );
bool is_safe_spell args( (CHAR_DATA *ch, CHAR_DATA *victim, bool area ) );
void violence_update args( ( void ) );
void multi_hit args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt ) );
bool damage args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dam,
int dt, int class ) );
void update_pos args( ( CHAR_DATA *victim ) );
void stop_fighting args( ( CHAR_DATA *ch, bool fBoth ) );
/* handler.c */
int check_immune args( (CHAR_DATA *ch, int dam_type) );
int material_lookup args( ( const char *name) );
int race_lookup args( ( const char *name) );
int class_lookup args( ( const char *name) );
bool is_old_mob args ( (CHAR_DATA *ch) );
int get_skill args( ( CHAR_DATA *ch, int sn ) );
int get_weapon_sn args( ( CHAR_DATA *ch ) );
int get_weapon_skill args(( CHAR_DATA *ch, int sn ) );
int get_age args( ( CHAR_DATA *ch ) );
void reset_char args( ( CHAR_DATA *ch ) );
int get_trust args( ( CHAR_DATA *ch ) );
int get_curr_stat args( ( CHAR_DATA *ch, int stat ) );
int get_max_train args( ( CHAR_DATA *ch, int stat ) );
int can_carry_n args( ( CHAR_DATA *ch ) );
int can_carry_w args( ( CHAR_DATA *ch ) );
bool is_name args( ( char *str, char *namelist ) );
bool is_name_exact ( char *str, char *namelist );
void affect_to_char args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void affect_to_obj args( ( OBJ_DATA *obj, AFFECT_DATA *paf ) );
void affect_remove args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void affect_remove_obj args( (OBJ_DATA *obj, AFFECT_DATA *paf ) );
void affect_strip args( ( CHAR_DATA *ch, int sn ) );
bool is_affected args( ( CHAR_DATA *ch, int sn ) );
void affect_join args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void char_from_room args( ( CHAR_DATA *ch ) );
void char_to_room args( ( CHAR_DATA *ch, ROOM_DATA *pRoomIndex ) );
void obj_to_char args( ( OBJ_DATA *obj, CHAR_DATA *ch ) );
void obj_from_char args( ( OBJ_DATA *obj ) );
int apply_ac args( ( OBJ_DATA *obj, int iWear, int type ) );
OD * get_eq_char args( ( CHAR_DATA *ch, int iWear ) );
void equip_char args( ( CHAR_DATA *ch, OBJ_DATA *obj, int iWear ) );
void unequip_char args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
int count_obj_list args( ( OBJ_INDEX_DATA *obj, OBJ_DATA *list ) );
void obj_from_room args( ( OBJ_DATA *obj ) );
void obj_to_room args( ( OBJ_DATA *obj, ROOM_DATA *pRoomIndex ) );
void obj_to_obj args( ( OBJ_DATA *obj, OBJ_DATA *obj_to ) );
void obj_from_obj args( ( OBJ_DATA *obj ) );
void extract_obj args( ( OBJ_DATA *obj, int perm_extract) );
void extract_char args( ( CHAR_DATA *ch, bool fPull ) );
CD * get_char_room args( ( CHAR_DATA *ch, char *argument ) );
CD * get_char_world args( ( CHAR_DATA *ch, char *argument ) );
OD * get_obj_type args( ( OBJ_INDEX_DATA *pObjIndexData ) );
OD * get_obj_list args( ( CHAR_DATA *ch, char *argument,
OBJ_DATA *list ) );
OD * get_obj_carry args( ( CHAR_DATA *ch, char *argument ) );
OD * get_obj_wear args( ( CHAR_DATA *ch, char *argument ) );
OD * get_obj_here args( ( CHAR_DATA *ch, char *argument ) );
OD * get_obj_world args( ( CHAR_DATA *ch, char *argument ) );
OD * create_money args( ( int amount ) );
int get_obj_number args( ( OBJ_DATA *obj ) );
int get_obj_weight args( ( OBJ_DATA *obj ) );
bool room_is_dark args( ( ROOM_DATA *pRoomIndex ) );
bool room_is_private args( ( ROOM_DATA *pRoomIndex ) );
bool can_see args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool can_see_obj args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
bool can_see_room args( ( CHAR_DATA *ch, ROOM_DATA *pRoomIndex) );
bool can_drop_obj args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
char * item_type_name args( ( OBJ_DATA *obj ) );
char * affect_loc_name args( ( int location ) );
char * affect_bit_name args( ( int vector ) );
char * extra_bit_name args( ( int extra_flags ) );
char * wear_bit_name args( ( int wear_flags ) );
char * act_bit_name args( ( int act_flags ) );
char * off_bit_name args( ( int off_flags ) );
char * imm_bit_name args( ( int imm_flags ) );
char * form_bit_name args( ( int form_flags ) );
char * part_bit_name args( ( int part_flags ) );
char * weapon_bit_name args( ( int weapon_flags ) );
char * comm_bit_name args( ( int comm_flags ) );
int rem_from_top (TOP_DATA *top_array, CHAR_DATA *ch);
int better_than (CHAR_DATA *ch, TOP_DATA *top_array, int num);
void add_to_top (TOP_DATA *top_array, CHAR_DATA *ch, int num);
void show_top_list (CHAR_DATA *ch, TOP_DATA *top_array);
void insert_top (CHAR_DATA *ch, TOP_DATA *top_array);
void top_stuff (CHAR_DATA *ch);
/* interp.c */
void interpret args( ( CHAR_DATA *ch, char *argument ) );
bool is_number args( ( char *arg ) );
int number_argument args( ( char *argument, char *arg ) );
char * one_argument args( ( char *argument, char *arg_first ) );
/* magic.c */
int mana_cost (CHAR_DATA *ch, int min_mana, int level);
int skill_lookup args( ( const char *name ) );
int slot_lookup args( ( int slot ) );
bool saves_spell args( ( int level, CHAR_DATA *victim ) );
void obj_cast_spell args( ( int sn, int level, CHAR_DATA *ch,
CHAR_DATA *victim, OBJ_DATA *obj ) );
/* save.c */
void save_char_obj args( ( CHAR_DATA *ch ) );
CHAR_DATA *load_char_obj args( ( DESCRIPTOR_DATA *d, char *name ) );
void save_account_list ();
/* skills.c */
bool parse_gen_groups args( ( CHAR_DATA *ch,char *argument ) );
void list_group_costs args( ( CHAR_DATA *ch ) );
void list_group_known args( ( CHAR_DATA *ch ) );
void check_improve args( ( CHAR_DATA *ch, int sn, bool success,
int multiplier ) );
int group_lookup args( (const char *name) );
void gn_add args( ( CHAR_DATA *ch, int gn) );
void gn_remove args( ( CHAR_DATA *ch, int gn) );
void group_add args( ( CHAR_DATA *ch, const char *name, bool deduct) );
void group_remove args( ( CHAR_DATA *ch, const char *name) );
/* special.c */
SF * spec_lookup args( ( const char *name ) );
/* update.c */
void advance_level args( ( CHAR_DATA *ch ) );
void gain_condition args( ( CHAR_DATA *ch, int iCond, int value ) );
void update_handler args( ( void ) );
#undef CD
#undef OD
#undef OID
#undef RID
#undef SF