/*****************************************************************************
* 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;
typedef struct group_data GROUP_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 /* Max amount of skills game can have is 1000 ( TYPE_UNKNOWN ) - ( TYPE_HIT ) */
#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 /* Max amount of herbs game can have is 1000 ( TYPE_HERB ) - ( TYPE_PERS ) */
#define MAX_PERS 500 /* Max amount of personal skills/spells game can have is (Unlimited currently) ( TYPE_PERS ) - ... */
#define MAX_PC_PERS 5 /* Maximum amount of personal skills/spells each character can have */
#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 "32"
/* 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
extern GROUP_DATA *first_group, *last_group;
struct group_data
{
GROUP_DATA *next, *prev;
CHAR_DATA *leader; /* Who is the leader of this group */
CHAR_DATA *first_char, *last_char; /* List of the characters in this group */
};
/* 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 absorb, no_absorb;
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 absorb, no_absorb;
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;
const 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,
SUB_SHELP_EDIT, SUB_CHELP_EDIT,
/* 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
{
EXT_BV class_restriction;
char *name; /* Name for 'who' */
int used; /* How many have picked this class on creation? */
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;
EXT_BV language; /* Default racial language */
char *name; /* Race name */
char *where_name[MAX_WHERE_NAME];
char *lodge_name[MAX_WHERE_NAME];
int used; /* How many have picked this race on creation? */
short base_stats[STAT_MAX]; /* Starting stats */
short max_stats[STAT_MAX]; /* Maximum stats */
short hit;
short mana;
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 struct victory_data VICTORY_DATA;
struct victory_data
{
VICTORY_DATA *next, *prev;
char *name;
char *vname;
time_t vtime;
int level;
int vlevel;
int vkills;
};
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;
VICTORY_DATA *first_victory, *last_victory;
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 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;
CHAR_DATA *first_copy, *last_copy;
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 absorb;
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;
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_group, *prev_in_group;
CHAR_DATA *next_in_room, *prev_in_room;
CHAR_DATA *next_index, *prev_index;
CHAR_DATA *master, *leader;
CHAR_DATA *next_pet, *prev_pet;
CHAR_DATA *reply, *retell;
CHAR_DATA *mount;
CHAR_DATA *mounter;
CHAR_DATA *editing;
GROUP_DATA *group; /* What group does is this character in */
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 absorb, no_absorb;
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; /* Not saved (for now) but used so npcs and no class pcs can gain exp */
int bsplatter; /* Blood splatter */
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 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 mod_stats[STAT_MAX];
short mental_state; /* simplified */
short mobinvis; /* Mobinvis level SB */
short colors[MAX_COLORS];
bool logged; /* are they logged? */
};
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;
};
typedef struct friend_data FRIEND_DATA;
struct friend_data
{
FRIEND_DATA *next, *prev;
char *name;
short sex;
bool approved; /* This isn't saved but is used to see if they have permission to have them on their list */
};
/* This is for explored data */
typedef struct exp_data EXP_DATA;
struct exp_data
{
EXP_DATA *next, *prev;
int vnum;
};
typedef struct mclass_data MCLASS_DATA;
struct mclass_data
{
MCLASS_DATA *next, *prev;
double exp; /* How much exp they have for this class */
int level; /* Level they are in this class */
int wclass; /* Which class is this one? */
short cpercent; /* How much percent of earned exp goes to this class? */
};
MCLASS_DATA *add_mclass( CHAR_DATA *ch, int wclass, int level, int cpercent, double exp, bool limit );
/* Data which only PC's have. */
struct pc_data
{
PC_DATA *next, *prev;
CHAR_DATA *character;
CHAR_DATA *first_pet, *last_pet;
MCLASS_DATA *first_mclass, *last_mclass;
NOTE_DATA *gnote;
CLAN_DATA *clan;
CLAN_DATA *nation;
COUNCIL_DATA *council;
AREA_DATA *area;
DEITY_DATA *deity;
KILLED_DATA killed[MAX_KILLTRACK];
FRIEND_DATA *first_friend, *last_friend; /* Keep a list of friends */
IGNORE_DATA *first_ignored, *last_ignored; /* Keep track of who to ignore */
EXP_DATA *first_explored, *last_explored; /* Keep track of where they have explored */
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 */
unsigned int questcompleted; /* Number of quest completed */
int nextregen; /* When do they get another regen */
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 personal[MAX_PC_PERS]; /* This is to keep a quick list of the personal skills/spells each person has (Not saved, set on login) */
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 */
};
/* 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, DAM_MAX
} 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;
EXTRA_DESCR_DATA *first_extradesc, *last_extradesc;
AFFECT_DATA *first_affect, *last_affect;
OBJ_DATA *first_copy, *last_copy; /* A list of all the copys of this index in game */
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 *next_index, *prev_index;
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;
int bsplatter; /* How much blood has been splattered on this eq */
int bstain; /* How much blood has left a stain on this eq */
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;
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 */
short expmulti; /* Exp Multiplier for everyone */
short mclass; /* How many classes can they be? */
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 */
bool autosavecset; /* Save cset when a change is made? */
bool autosavecommands; /* Save commands when a change is made? */
bool autosavesocials; /* Save socials when a change is made? */
bool autosaveskills; /* Save skills when a change is made? */
};
/* Room type. */
struct room_index_data
{
ROOM_INDEX_DATA *next;
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;
int charcount; /* Amount of characters in room */
int objcount; /* Amount of objects in room */
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
/* 0 - 1000 = spells/skills/etc... */
#define TYPE_HIT 1000
/* 1000 - 2000 = attack types */
#define TYPE_HERB 2000
/* 2000 - 3000 = herb types */
#define TYPE_PERS 3000
/* 3000 + = personal types */
typedef enum
{
SKILL_UNKNOWN, SKILL_SPELL, SKILL_SKILL, SKILL_WEAPON, SKILL_TONGUE,
SKILL_HERB, SKILL_PERSONAL, SKILL_DELETED
} 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 *abs_char; /* Victim absorb msg to caster */
char *abs_vict; /* Victim absorb msg to victim */
char *abs_room; /* Victim absorb msg to room */
char *dice; /* Dice roll */
char *components; /* Spell components, if any */
char *teachers; /* Skill requires a special teacher */
char *htext; /* Skill help text */
int value; /* Misc value */
int min_level; /* Minimum level to be able to cast */
short participants; /* # of required participants */
short saves; /* What saving spell applies */
short difficulty; /* Difficulty of casting/learning */
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 req_skill; /* Slot for required skill to have to learn this one */
short min_mana; /* Minimum mana used */
short beats; /* Rounds required to use skill */
struct timerset userec; /* Usage record */
bool tmpspell; /* Used by personals to decide if it is a spell/skill */
};
/* 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 const char *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_has_all_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 xHAS_ALL_BITS( var, bit ) ( ext_has_all_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)
/* Use this on normal things that aren't strings */
#define DISPOSE(point) \
do \
{ \
if( (point) ) \
free( (point) ); \
(point) = NULL; \
} while( 0 )
/* This one is to use on strings that you wish to dispose of */
#define STRDISPOSE(point) \
do \
{ \
if( (point) ) \
{ \
if( typeid((point)) == typeid(char*) ) \
{ \
if( in_hash_table( (const char*)(point) ) ) \
{ \
log_printf( "&RSTRDISPOSE 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 ) STRDISPOSE( (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( const char *filename );
bool valid_pfile( const char *filename );
bool can_use_path( CHAR_DATA *ch, const char *direct, const 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_valid_pers( 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. */
char *pers( CHAR_DATA *ch, CHAR_DATA *looker );
#define PERS( ch, looker ) ( pers( (ch), (looker) ) )
char *morphpers( CHAR_DATA *ch, CHAR_DATA *looker );
#define MORPHPERS( ch, looker ) ( morphpers( (ch), (looker) ) )
#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;
DO_FUN *do_fun;
EXT_BV flags;
struct timerset userec;
char *name;
char *fun_name;
char *htext;
int lag_count; /* count lag flags for this cmd - FB */
short position;
short perm;
short log;
};
/* 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];
const char *dis_race_name( int race );
extern const struct liq_type liq_table[LIQ_MAX];
extern const char *attack_table[DAM_MAX];
extern const char **const s_message_table[DAM_MAX];
extern const char **const p_message_table[DAM_MAX];
extern const char *const skill_tname[];
extern short const movement_loss[SECT_MAX];
extern const char *dir_name[];
extern const char *where_name[MAX_WHERE_NAME];
extern const char *lodge_name[MAX_WHERE_NAME];
extern const short rev_dir[];
extern const int trap_door[];
extern const char *r_flags[];
extern const char *w_flags[];
extern const char *item_w_flags[];
extern const char *o_flags[];
extern const char *a_flags[];
extern const char *o_types[];
extern const char *a_types[];
extern const char *act_flags[];
extern const char *plr_flags[];
extern const char *pc_flags[];
extern const char *trap_flags[];
extern const char *ris_flags[];
extern const char *trig_flags[];
extern const char *part_flags[];
extern const char *defense_flags[];
extern const char *attack_flags[];
extern const char *area_flags[];
extern const char *ex_pmisc[];
extern const char *ex_pwater[];
extern const char *ex_pair[];
extern const char *ex_pearth[];
extern const char *ex_pfire[];
extern int const lang_array[];
extern const char *lang_names[];
extern const char *temp_settings[]; /* FB */
extern const char *precip_settings[];
extern const char *wind_settings[];
extern const char *preciptemp_msg[6][6];
extern const char *windtemp_msg[6][6];
extern const char *precip_msg[];
extern const char *wind_msg[];
extern const char *wear_locs[];
extern const char *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 int num_corpses;
extern struct system_data sysdata;
extern int top_sn;
extern int top_herb;
extern int top_pers;
extern CMDTYPE *command_hash[126];
extern CLASS_TYPE *class_table[MAX_CLASS];
const char *dis_class_name( int Class );
const char *dis_main_class_name( CHAR_DATA *ch );
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 SKILLTYPE *pers_table[MAX_PERS];
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 PC_DATA *first_pc, *last_pc;
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_cast );
DECLARE_DO_FUN( do_cedit );
DECLARE_DO_FUN( do_circle );
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( const char *argument, const char *channel, int level );
void to_channel_printf( const char *channel, int level, const 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 );
const char *rev_exit( short vdir );
/* act_obj.c */
void damage_obj( OBJ_DATA *obj );
short get_obj_resistance( OBJ_DATA *obj );
void save_storage( ROOM_INDEX_DATA *room );
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, const char *flagarray[] );
char *ext_flag_string( EXT_BV *bitvector, const char *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, const char *fmt, ... ) __attribute__ ( ( format( printf, 2, 3 ) ) );
void act_printf( short AType, CHAR_DATA *ch, void *arg1, void *arg2, int type, const char *fmt, ... ) __attribute__ ( ( format( printf, 6, 7 ) ) );
void playing_printf( CHAR_DATA *ch, const char *fmt, ... ) __attribute__ ( ( format( printf, 2, 3 ) ) );
void pager_printf( CHAR_DATA *ch, const 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, const 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( const 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, const char *file, const char *str );
void append_to_file( const char *file, const 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 *new_object( int vnum );
ROOM_INDEX_DATA *new_room( int vnum );
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, const 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, bool candameq );
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 */
const 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( const 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 );
short get_perm_stat( int stat, CHAR_DATA *ch );
short get_mod_stat( int stat, CHAR_DATA *ch );
short get_curr_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 );
const 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, bool extdisplay );
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( const 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 pers_lookup( const char *name );
int ch_pers_lookup( const char *pchar, 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( bool autosave );
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 write_race_file( int ra );
void save_classes( void );
void save_races( void );
void load_classes( void );
void load_herb_table( void );
void save_herb_table( bool autosave );
void load_pers_table( void );
void save_pers_table( bool autosave );
void load_races( void );
void load_tongues( void );
void asskills( const char *type );
/* 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( const char *str, const char *filename, int line );
char *quick_link( const char *str, const char *filename, int line );
int str_free( const char *str, const char *filename, int line );
void show_hash( int count );
char *hash_stats( void );
char *check_hash( const char *str );
void hash_dump( int hash );
void show_high_hash( int top );
bool in_hash_table( const 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_possible_adept( CHAR_DATA *ch, int sn );
int get_adept( CHAR_DATA *ch, int sn );