/*****************************************************************************
* 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 - 2012 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 reset_track_data RESET_TRACK_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 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 MEL 49
//#define MAX_EDITOR_LINES MEL
#define MFN 1024
//#define MAX_FILE_NAME MFN
#define HASHSTR /* use string hashing */
#define MAX_NEST 20 /* maximum container nesting */
/*
* 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
#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
#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 )
#define HAS_SPELL_INDEX -1
typedef struct mpdamage_data MPDAMAGE_DATA;
struct mpdamage_data
{
MPDAMAGE_DATA *next, *prev;
char *keyword;
char *roommsg; /* Hit messsage to room */
char *charmsg; /* Hit message to char */
char *victmsg; /* Hit message to victim */
char *immroom; /* Immune message to room */
char *immchar; /* Immune message to char */
char *immvict; /* Immune message to victim */
char *absroom; /* Absorb message to room */
char *abschar; /* Absorb message to char */
char *absvict; /* Absorb message to victim */
bool resistant[RIS_MAX]; /* This will allow us to set what resistants if any should be checked */
};
#define MPDAMAGE_FILE SYSTEM_DIR "mpdamage.dat"
/* 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, rSTOP, 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 */
/* If you need more then 128 increase XBI by 1 (to add 32 more spots) */
#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
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;
int resistant[RIS_MAX];
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 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 resistant[RIS_MAX];
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 favorused; /* Amount of favor 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;
};
typedef struct time_info_data TIME_INFO_DATA;
struct time_info_data
{
int year;
short hour;
short day;
short wday;
short month;
short sunlight;
};
extern TIME_INFO_DATA time_info; /* Timeinfo.c */
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;
AREA_DATA *address;
char *name;
};
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;
/* 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, SUB_OBJ_DESC,
/* 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;
};
/* 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 class_restriction;
EXT_BV language; /* Default racial language */
EXT_BV where_restrict; /* Lets allow people to set what places they may not wear equipment */
char *name; /* Race name */
char *where_name[MAX_WHERE_NAME];
char *lodge_name[MAX_WHERE_NAME];
int resistant[RIS_MAX];
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 affected;
EXT_BV Class; /* Classes allowed to use this */
EXT_BV race; /* Races allowed to use this */
char *filename;
char *name;
char *description;
int resistant[RIS_MAX];
int sex;
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;
};
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;
int type;
short location;
bool enchantment; /* Was this an enchantment */
};
/* A SMAUG spell */
typedef struct smaug_affect SMAUG_AFF;
struct smaug_affect
{
SMAUG_AFF *next, *prev;
char *duration;
char *modifier;
int bitvector;
short 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 */
/* Old Lever/dial/switch/button/pullchain flags, kept to convert over */
#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_MAX
} dir_types;
/* Use DIR_MAX for things you want to allow all the others */
#define MAX_DIR DIR_SOUTHWEST /* max for normal walking */
#define DIR_PORTAL DIR_SOMEWHERE /* portal direction */
#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
{
/* 0 - PT_WATER */
PULL_UNDEFINED, PULL_VORTEX, PULL_VACUUM, PULL_SLIP,
PULL_ICE, PULL_MYSTERIOUS,
/* PT_WATER - PT_AIR */
PULL_CURRENT = PT_WATER, PULL_WAVE, PULL_WHIRLPOOL, PULL_GEYSER,
/* PT_AIR - PT_EARTH */
PULL_WIND = PT_AIR, PULL_STORM, PULL_COLDWIND, PULL_BREEZE,
/* PT_EARTH - PT_FIRE */
PULL_LANDSLIDE = PT_EARTH, PULL_SINKHOLE, PULL_QUICKSAND, PULL_EARTHQUAKE,
/* PT_FIRE (and higher) */
PULL_LAVA = PT_FIRE, PULL_HOTAIR
} dir_pulltypes;
/* Conditions. */
typedef enum
{
COND_DRUNK, COND_FULL, COND_THIRST, MAX_CONDS
} conditions;
typedef enum
{
TIMER_NONE, TIMER_RECENTFIGHT, TIMER_SHOVEDRAG, TIMER_DO_FUN,
TIMER_APPLIED, TIMER_PKILLED, TIMER_ASUPPRESSED
} timer_types;
struct timer_data
{
TIMER *next, *prev;
DO_FUN *do_fun;
int value;
int count;
short type;
};
/*
* Prototype for a mob.
* This is the in-memory version of #MOBILES.
*/
struct mob_index_data
{
MOB_INDEX_DATA *next;
MOB_INDEX_DATA *next_amob, *prev_amob;
AREA_DATA *area;
CHAR_DATA *first_copy, *last_copy;
RESET_TRACK_DATA *first_track, *last_track;
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 attacks;
EXT_BV defenses;
EXT_BV speaks, speaking;
char *name;
char *short_descr;
char *long_descr;
char *description;
char *spec_funname;
int resistant[RIS_MAX]; /* How does it affect resistances */
int avnum; /* The area vnum this mobile belongs to */
int vnum;
int gold;
int minhit;
int maxhit;
int level;
short sex;
short alignment;
short ac;
short numattacks;
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 height;
short weight;
short hitroll;
short damroll;
short count;
short killed;
};
struct hunt_hate_fear
{
HHF_DATA *next, *prev; /* For the mobiles' hunts, hates and fears */
HHF_DATA *lnext, *lprev; /* For all mobiles' hunts, hates and fears */
CHAR_DATA *mob; /* What mobile is hunting, hating and fearing */
CHAR_DATA *who; /* Who they are hunting, hating and fearing */
char *name; /* Name of who they are hunting, hating and fearing so can last past log on and off */
};
struct fighting_data
{
CHAR_DATA *who;
short align;
short duration;
short timeskilled;
};
struct editor_data
{
short numlines;
short on_line;
short size;
char line[MEL][( 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_in_area, *prev_in_area;
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;
CHAR_DATA *summoning; /* Just points to who they are/were summoning */
HHF_DATA *first_hunting, *last_hunting;
HHF_DATA *first_hating, *last_hating;
HHF_DATA *first_fearing, *last_fearing;
SPEC_FUN *spec_fun;
EXT_BV xflags;
EXT_BV act;
EXT_BV affected_by, no_affected_by;
EXT_BV attacks;
EXT_BV defenses;
EXT_BV deaf;
EXT_BV speaks, speaking;
RESET_DATA *reset;
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 resistant[RIS_MAX]; /* How does it affect resistances */
int bsplatter; /* Blood splatter */
int mpactnum;
int tempnum;
int temp_played, played;
int questcountdown;
int questvnum;
int questtype;
int questgiver;
int gold;
int carry_weight;
int carry_number;
int retran;
int regoto;
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];
short cords[2]; /* cords[0] = x, cords[1] = y */
bool logged; /* are they logged? */
};
struct killed_data
{
KILLED_DATA *next, *prev;
int vnum;
int 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? */
};
/* 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 *first_killed, *last_killed;
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;
PER_HISTORY *first_fchat, *last_fchat;
#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 *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 int swins, squits; /* Sudoku wins and quits */
unsigned int rwins, rquits; /* Rubiks completed and quit */
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 birth_year;
int wizinvis; /* wizinvis level */
int min_snoop; /* minimum snoop level */
int onboard;
short rubik[54]; /* For the rubik's cube */
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;
OBJ_INDEX_DATA *next_aobj, *prev_aobj;
EXTRA_DESCR_DATA *first_extradesc, *last_extradesc;
AFFECT_DATA *first_affect, *last_affect;
RESET_TRACK_DATA *first_track, *last_track;
OBJ_DATA *first_copy, *last_copy; /* A list of all the copys of this index in game */
MPROG_DATA *mudprogs; /* objprogs */
AREA_DATA *area;
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; /* Short description for the object */
char *description; /* Long description for the object */
char *action_desc;
char *desc; /* Description for the object */
int avnum; /* The area vnum this object belongs to */
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 */
RESET_DATA *reset;
char *name;
char *short_descr; /* Short description for the object */
char *description; /* Long description for the object */
char *desc; /* Description for the object */
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;
short cords[2]; /* 0 = x, 1 = y */
bool auctioned; /* Item is being auctioned */
};
/* 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 */
EXT_BV base_info; /* Base door states & other flags, since lots of things changes exit_info 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
* 'T': trap an object
* 'D': set state of door
* 'R': randomize room exits
* 'S': stop (end of list)
*/
/* Room - reset definition. */
struct reset_data
{
RESET_DATA *main_reset; /* Not saved just used in game to point to the main one for like P G and E */
RESET_DATA *next, *prev;
RESET_DATA *first_reset, *last_reset;
RESET_DATA *next_reset, *prev_reset;
CHAR_DATA *ch;
OBJ_DATA *obj;
char command;
int extra;
int arg1;
int arg2;
int arg3;
short rchance; /* 1-100% chance of it reseting */
short cords[2]; /* X = 0, Y = 1 */
bool wilderness; /* Should this use cords */
};
/* Keep track of all the resets assigned to the object/mobile */
struct reset_track_data
{
RESET_TRACK_DATA *next, *prev;
RESET_DATA *reset; /* What reset is it pointing too */
};
/* Area flags */
typedef enum
{
AREA_NONE, 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;
OBJ_INDEX_DATA *first_obj, *last_obj;
MOB_INDEX_DATA *first_mob, *last_mob;
CHAR_DATA *first_person, *last_person;
WEATHER_DATA *weather;
EXT_BV flags;
char *name;
char *filename;
char *author; /* Scryn */
char *resetmsg; /* Rennard */
int vnum; /* New area vnum */
int top_room;
int top_obj;
int top_mob;
int low_vnum, hi_vnum;
int low_soft_range, hi_soft_range;
int low_hard_range, hi_hard_range;
short status;
short age;
short nplayer;
short reset_frequency;
short max_players;
};
/* Used to keep track of system settings and statistics -Thoric */
struct system_data
{
EXT_BV save_flags; /* Toggles for saving conditions */
void *dlHandle;
char *mud_name; /* Name of mud */
time_t time_of_max; /* Time of max ever */
time_t next_pfile_cleanup; /* Time of next pfile cleaning */
int maxplayers; /* Maximum players this boot */
int alltimemax; /* Maximum players ever */
int room_limbo;
int room_poly;
int room_authstart;
int room_deadly;
int room_school;
int room_temple;
int room_altar;
int groupleveldiff; /* Max level difference allowed to group */
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 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 maxkillhistory; /* Max number of killes to be tracked */
short expmulti; /* Exp Multiplier for everyone */
short mclass; /* How many classes can they be? */
short version_major;
short version_minor;
short maxauction; /* How many things can each person have on auction */
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 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? */
bool autosavehelps; /* Save helps when a change is made? */
bool morph_opt; /* Save morphs when a change is made? */
bool groupall; /* If false, pkills can only party with pkills */
};
/* 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 avnum; /* The area vnum this room belongs to */
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 - 999 = spells/skills/weapons/tongues */
#define TYPE_HIT 1000
/* 1000 - 1999 = attack types */
#define TYPE_HERB 2000
/* 2000 - 2999 = 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; /* Sectors Spell will work in */
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 */
char *reqskillname; /* Used on startup to save req_skill names to check after loading them all */
int value; /* Misc value */
int type; /* Spell/Skill/Weapon/Tongue */
short participants; /* # of required participants */
short saves; /* What saving spell applies */
short difficulty; /* Difficulty of casting/learning */
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 */
short stats[STAT_MAX]; /* Required stats to use this skill */
struct timerset userec; /* Usage record */
bool tmpspell; /* Used by personals to decide if it is a spell/skill */
bool magical; /* Is this a magical spell/skill? */
};
/* 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 );
char lower( char c );
char upper( char c );
#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 ) ( lower( (c) ) )
#define UPPER( c ) ( upper( (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*) && in_hash_table( (const char *)(point) ) ) \
{ \
log_printf( "&RSTRDISPOSE called on STRALLOC pointer: %s, line %d&D\n", __FILE__, __LINE__ ); \
str_free( (char*)(point), __FILE__, __LINE__ ); \
} \
else \
free( (point) ); \
} \
(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&D\n", __FILE__, __LINE__ ); \
free( (point) ); \
} \
else \
str_free( (point), __FILE__, __LINE__ ); \
} \
(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)
/* Used to link stuff into a hash list */
#define HASH_LINK(link, hashlist, tmp, prev, insert) \
do \
{ \
int hash = ( LOWER( (link)->name[0] ) % 126 ); \
\
if( !( (prev) = (tmp) = (hashlist)[hash] ) ) \
{ \
(link)->next = (hashlist)[hash]; \
(hashlist)[hash] = (link); \
} \
else \
{ \
for( ; (tmp); (tmp) = (tmp)->next ) \
{ \
if( !(tmp)->next ) \
{ \
(tmp)->next = (link); \
(link)->next = NULL; \
break; \
} \
else if( (insert) ) \
{ \
if( (tmp) == (hashlist)[hash] \
&& strcmp( (link)->name, (tmp)->name ) < 0 ) \
{ \
(link)->next = (hashlist)[hash]; \
(hashlist)[hash] = (link); \
break; \
} \
if( strcmp( (link)->name, (tmp)->next->name ) < 0 ) \
{ \
(link)->next = (tmp)->next; \
(tmp)->next = (link); \
break; \
} \
} \
} \
} \
} while(0)
/* Used to unlink stuff into a hash list */
#define HASH_UNLINK(link, hashlist, tmp) \
do \
{ \
int hash = ( LOWER( (link)->name[0] ) % 126 ); \
\
if( (link) == ( (tmp) = (hashlist)[hash] ) ) \
(hashlist)[hash] = (tmp)->next; \
else \
for( ; (tmp); (tmp) = (tmp)->next ) \
if( (link) == (tmp)->next ) \
{ \
(tmp)->next = (tmp)->next->next; \
break; \
} \
} 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)
/* 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) ) )
/* 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) ) )
/* 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 group; /* what group does this command go with if any? */
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;
};
/*
* 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_smaug );
DECLARE_SPELL_FUN( spell_teleport );
#include "dfiles.h"
/* object saving defines for fread/write_obj. -- Altrag */
#define OS_CARRY 0
#define OS_CORPSE 1
#define OS_AUCTION 2
#define OS_LOCKER 3
/* mud prog defines */
#define ERROR_PROG -1
#define IN_FILE_PROG -2
#define LEARNED( ch, sn ) ( is_npc( (ch) ) ? 80 : URANGE( 0, ch->pcdata->learned[sn], 100 ) )
/* Act_comm.c */
CMDF( do_emote );
CMDF( do_quit );
LANG_DATA *get_lang( const char *name );
char *drunk_speech( const char *argument, CHAR_DATA *ch );
char *translate( int percent, const char *in, const char *name );
void free_phistory( PER_HISTORY *phistory );
void add_phistory( int type, CHAR_DATA *ch, char *argument );
void fwrite_phistory( CHAR_DATA *ch, FILE *fp );
void fread_phistory( CHAR_DATA *ch, FILE *fp, int type );
void send_ansi_title( CHAR_DATA *ch );
void send_ascii_title( CHAR_DATA *ch );
void add_follower( CHAR_DATA *ch, CHAR_DATA *master );
void stop_follower( CHAR_DATA *ch );
void die_follower( CHAR_DATA *ch );
void remove_char_from_group( CHAR_DATA *ch );
void free_all_groups( void );
int knows_language( CHAR_DATA *ch, int language );
bool circle_follow( CHAR_DATA *ch, CHAR_DATA *victim );
bool is_same_group( CHAR_DATA *ach, CHAR_DATA *bch );
/*------------*/
/* Act_info.c */
CMDF( do_look );
CMDF( do_exits );
CMDF( do_wimpy );
char *format_obj_to_char( OBJ_DATA *obj, CHAR_DATA *ch, bool fShort );
char *double_punct( double foo );
char *num_punct( int foo );
const char *show_weather( AREA_DATA *area );
void show_list_to_char( OBJ_DATA *list, CHAR_DATA *ch, bool fShort, bool fShowNothing );
void show_char_to_char( CHAR_DATA *list, CHAR_DATA *ch );
void show_condition( CHAR_DATA *ch, CHAR_DATA *victim );
int get_door( char *arg );
bool is_ignoring( CHAR_DATA *ch, CHAR_DATA *ign_ch );
/*------------*/
/* Act_move.c */
extern bool sneaking_char;
CMDF( do_sit );
CMDF( do_sleep );
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 );
EXIT_DATA *find_door( CHAR_DATA *ch, char *arg, bool quiet );
extern const short movement_loss[SECT_MAX];
extern const char *dir_name[];
extern const int trap_door[];
extern const short rev_dir[];
const char *rev_exit( short vdir );
void teleport( CHAR_DATA *ch, int room, int flags );
ch_ret move_char( CHAR_DATA *ch, EXIT_DATA *pexit, int fall, bool running );
ch_ret pullcheck( CHAR_DATA *ch, int pulse );
short encumbrance( CHAR_DATA *ch, short move );
bool will_fall( CHAR_DATA *ch, int fall );
/*------------*/
/* Act_obj.c */
void show_obj( CHAR_DATA *ch, OBJ_DATA *obj );
void damage_obj( OBJ_DATA *obj );
void wear_obj( CHAR_DATA *ch, OBJ_DATA *obj, bool fReplace, short wear_bit );
void obj_fall( OBJ_DATA *obj, bool through );
void randomize_obj( OBJ_DATA *obj );
short get_obj_resistance( OBJ_DATA *obj );
/*------------*/
/* Act_wiz.c */
CMDF( do_at );
CMDF( do_rstat );
CMDF( do_ostat );
CMDF( do_mstat );
CMDF( do_restoretime );
ROOM_INDEX_DATA *find_location( CHAR_DATA *ch, char *arg );
void close_area( AREA_DATA *pArea );
void close_all_areas( void );
void transfer_char( CHAR_DATA *ch, CHAR_DATA *victim, ROOM_INDEX_DATA *location );
void echo_to_all( short AT_COLOR, const char *argument, short tar );
void echo_to_all_printf( short AT_COLOR, short tar, const char *fmt, ... ) __attribute__ ( ( format( printf, 3, 4 ) ) );
bool check_area_conflict( AREA_DATA *area, int low_range, int hi_range );
bool rename_character( CHAR_DATA *ch, char *newname );
/*------------*/
/* Affects.c */
AFFECT_DATA *fread_chaffect( FILE *fp, int atype, const char *filename, int line );
void showaffect( CHAR_DATA *ch, AFFECT_DATA *paf, bool extdisplay );
void fwrite_objaffects( FILE *fp, AFFECT_DATA *paf );
void fwrite_chaffect( FILE *fp, AFFECT_DATA *paf );
void fwrite_oiaffect( FILE *fp, AFFECT_DATA *paf );
/*------------*/
/* Areas.c */
bool fold_area( AREA_DATA *tarea, char *filename, bool install );
/*------------*/
/* Auth.c */
void free_all_auths( void );
void save_auths( void );
void load_auths( void );
void add_to_auth( char *name );
void auth_update( void );
bool not_authorized( CHAR_DATA *ch );
/*------------*/
/* Ban.c */
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;
void load_banlist( void );
void save_banlist( void );
void dispose_ban( BAN_DATA *pban, int type );
void free_bans( void );
int add_ban( CHAR_DATA *ch, char *arg1, char *arg2, int btime, int type );
bool check_race_bans( int iRace );
bool check_class_bans( int iClass );
bool check_total_bans( DESCRIPTOR_DATA *d );
bool check_expire( BAN_DATA *pban );
bool check_bans( CHAR_DATA *ch, int type );
/*------------*/
/* Bank.c */
char *show_char_gold( CHAR_DATA *ch );
void setmaxdoublegold( void );
void set_gold( CHAR_DATA *ch, int amount );
void decrease_gold( CHAR_DATA *ch, int amount );
void free_all_banks( void );
void load_banks( void );
void give_interest( void );
bool increase_gold( CHAR_DATA *ch, int amount );
bool has_gold( CHAR_DATA *ch, int amount );
bool can_hold_gold( CHAR_DATA *ch, int amount );
/*------------*/
/* Boards.c */
void note_attach( CHAR_DATA *ch );
void show_unread_notes( CHAR_DATA *ch );
void free_note( NOTE_DATA *pnote );
void do_note( CHAR_DATA *ch, char *arg_passed, bool IS_MAIL );
void load_boards( void );
void check_auction( CHAR_DATA *ch );
void free_boards( void );
/*------------*/
/* Bti.c */
void free_all_bti( void );
void load_bti( void );
/*------------*/
/* Build.c */
extern REL_DATA *first_relation, *last_relation;
CMDF( do_goto );
EXTRA_DESCR_DATA *SetRExtra( ROOM_INDEX_DATA *room, char *keywords );
EXTRA_DESCR_DATA *SetOExtra( OBJ_DATA *obj, char *keywords );
EXTRA_DESCR_DATA *SetOExtraProto( OBJ_INDEX_DATA *obj, char *keywords );
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 const char *trig_flags[];
extern const char *cont_flags[];
char *flag_string( int bitvector, const char *flagarray[] );
char *ext_class_string( EXT_BV *bitvector );
char *ext_race_string( EXT_BV *bitvector );
char *ext_flag_string( EXT_BV *bitvector, const char *flagarray[] );
char *strip_cr( char *str );
char *copy_buffer( CHAR_DATA *ch );
void stop_editing( CHAR_DATA *ch );
void start_editing( CHAR_DATA *ch, char *data );
void edit_buffer( CHAR_DATA *ch, char *argument );
void assign_area( CHAR_DATA *ch );
void RelCreate( relation_type tp, void *actor, void *subject );
void RelDestroy( relation_type tp, void *actor, void *subject );
void remove_from_everything( const char *name );
int get_dir( char *txt );
int get_trigflag( char *flag );
int get_pc_class( char *Class );
int get_pc_race( char *type );
int get_pulltype( char *type );
bool DelRExtra( ROOM_INDEX_DATA *room, char *keywords );
bool DelOExtra( OBJ_DATA *obj, char *keywords );
bool DelOExtraProto( OBJ_INDEX_DATA *obj, char *keywords );
bool can_rmodify( CHAR_DATA *ch, ROOM_INDEX_DATA *room );
bool can_medit( CHAR_DATA *ch, MOB_INDEX_DATA *mob );
bool is_npc( CHAR_DATA *ch );
bool is_immortal( CHAR_DATA *ch );
bool is_avatar( CHAR_DATA *ch );
/*------------*/
/* Channels.c */
void free_all_channels( void );
void load_channels( void );
void log_string_plus( const char *str, short log_type, int level );
#define log_string(txt) ( log_string_plus( (txt), LOG_NORMAL, PERM_LOG ) )
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 ) ) );
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 ) ) );
bool check_channel( CHAR_DATA *ch, char *command, char *argument );
/*------------*/
/* Clans.c */
extern CLAN_DATA *first_clan, *last_clan;
extern COUNCIL_DATA *first_council, *last_council;
CLAN_DATA *get_clan( char *name );
COUNCIL_DATA *get_council( char *name );
void write_council_list( void );
void write_clan_list( void );
void save_council( COUNCIL_DATA *council );
void save_clan( CLAN_DATA *clan );
void load_councils( void );
void load_clans( void );
void update_clan_victory( CLAN_DATA *clan, CHAR_DATA *ch, CHAR_DATA *vict );
void free_member( MEMBER_DATA *member );
void add_clan_member( CLAN_DATA *clan, const char *name );
void free_clans( void );
void add_council_member( COUNCIL_DATA *council, const char *name );
void free_councils( void );
bool remove_council_member( COUNCIL_DATA *council, const char *name );
bool rename_council_member( COUNCIL_DATA *council, const char *oname, const char *nname );
bool is_clan_member( CLAN_DATA *clan, const char *name );
bool rename_clan_member( CLAN_DATA *clan, const char *oname, const char *nname );
bool remove_clan_member( CLAN_DATA *clan, const char *name );
/*------------*/
/* Classes.c */
extern int MAX_PC_CLASS;
extern CLASS_TYPE *class_table[MAX_CLASS];
extern int num_descriptors;
extern time_t boot_time;
MCLASS_DATA *add_mclass( CHAR_DATA *ch, int wclass, int level, int cpercent, double exp, bool limit );
void write_class_file( int cl );
void load_class_restrictions( void );
void load_classes( void );
void save_classes( void );
int get_char_cnum( CHAR_DATA *ch, char *argument );
bool char_is_class( CHAR_DATA *ch, int cnum );
/*------------*/
/* Comm.c */
/* So we can have different configs for different ports -- Shaddai */
extern int port;
extern bool mud_down;
extern time_t current_time;
extern PC_DATA *first_pc, *last_pc;
extern DESCRIPTOR_DATA *first_descriptor, *last_descriptor;
extern char lastplayercmd[MIL *2];
extern char str_boot_time[MIL];
char *myobj( OBJ_DATA *obj );
char *obj_short( OBJ_DATA *obj );
char *default_fprompt( CHAR_DATA *ch );
char *default_prompt( CHAR_DATA *ch );
void act( short AType, const char *format, CHAR_DATA *ch, void *arg1, void *arg2, int type );
void game_loop( void );
void new_descriptor( void );
void free_desc( DESCRIPTOR_DATA *d );
void close_socket( DESCRIPTOR_DATA *dclose, bool force );
void caught_alarm( int signum );
void read_from_buffer( DESCRIPTOR_DATA *d );
void write_to_buffer( DESCRIPTOR_DATA *d, const char *txt, unsigned int length );
void nanny( DESCRIPTOR_DATA *d, char *argument );
void stop_idling( CHAR_DATA *ch );
void display_prompt( DESCRIPTOR_DATA *d );
void set_pager_input( DESCRIPTOR_DATA *d, char *argument );
void open_mud_log( void );
double get_percent( int fnum, int snum );
bool pager_output( DESCRIPTOR_DATA *d );
bool exists_file( char *name );
bool is_valid_path( CHAR_DATA *ch, const char *direct, const char *filename );
bool can_use_path( CHAR_DATA *ch, const char *direct, const char *filename );
bool multi_check( DESCRIPTOR_DATA *host, bool full );
bool check_reconnect( DESCRIPTOR_DATA *d, char *name, bool fConn );
bool check_playing( DESCRIPTOR_DATA *d, char *name, bool kick );
bool check_parse_name( char *name, bool newchar );
bool write_to_descriptor_old( int desc, const char *txt, int length );
bool write_to_descriptor( DESCRIPTOR_DATA *d, const char *txt, int length );
bool flush_buffer( DESCRIPTOR_DATA *d, bool fPrompt );
bool read_from_descriptor( DESCRIPTOR_DATA *d );
/*------------*/
/* Commands.c */
CMDTYPE *find_command( char *command, bool exact );
void load_commands( void );
void free_commands( void );
/*------------*/
/* Const.c */
/* Some that would be here are in Const.h */
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];
OBJ_DATA *get_eq_hold( CHAR_DATA *ch, int type );
OBJ_DATA *get_next_eq_hold( CHAR_DATA *ch, OBJ_DATA *oobj, int type );
void code_check( void );
int get_ac( CHAR_DATA *ch );
int get_hitroll( CHAR_DATA *ch );
int get_damroll( CHAR_DATA *ch );
/*------------*/
/* Db.c */
#include "db.h"
/*------------*/
/* Deity.c */
extern DEITY_DATA *first_deity, *last_deity;
DEITY_DATA *get_deity( char *name );
void save_deity( DEITY_DATA *deity );
void load_deity( void );
void free_deities( void );
void adjust_favor( CHAR_DATA *ch, int field, int mod );
bool rename_deity_worshipper( DEITY_DATA *deity, const char *oname, const char *nname );
bool remove_deity_worshipper( DEITY_DATA *deity, const char *name );
bool is_deity_worshipper( DEITY_DATA *deity, const char *name );
/*------------*/
/* Exp.c */
void update_level( CHAR_DATA *ch );
void advance_level( CHAR_DATA *ch );
void gain_exp( CHAR_DATA *ch, double gain );
double exp_level( CHAR_DATA *ch, int level );
double xp_compute( CHAR_DATA *gch, CHAR_DATA *victim );
/*------------*/
/* Fight.c */
extern HHF_DATA *first_hating, *last_hating;
extern HHF_DATA *first_hunting, *last_hunting;
extern HHF_DATA *first_fearing, *last_fearing;
CMDF( do_flee );
OBJ_DATA *get_eq_location( CHAR_DATA *ch, int iWear );
CHAR_DATA *who_fighting( CHAR_DATA *ch );
void stop_hunting( CHAR_DATA *ch, CHAR_DATA *victim, bool complete );
void start_hunting( CHAR_DATA *ch, CHAR_DATA *victim );
void stop_hating( CHAR_DATA *ch, CHAR_DATA *victim, bool complete );
void start_hating( CHAR_DATA *ch, CHAR_DATA *victim );
void stop_fearing( CHAR_DATA *ch, CHAR_DATA *victim, bool complete );
void start_fearing( CHAR_DATA *ch, CHAR_DATA *victim );
void stop_hhf( CHAR_DATA *ch );
void fix_hhf( CHAR_DATA *ch );
void violence_update( void );
void check_killer( CHAR_DATA *ch, CHAR_DATA *victim );
void update_pos( CHAR_DATA *victim );
void free_fight( CHAR_DATA *ch );
void stop_fighting( CHAR_DATA *ch, bool fBoth );
void death_cry( CHAR_DATA *ch );
void raw_kill( CHAR_DATA *ch, CHAR_DATA *victim );
void group_gain( CHAR_DATA *ch, CHAR_DATA *victim );
void set_fighting( CHAR_DATA *ch, CHAR_DATA *victim );
void new_dam_message( CHAR_DATA *ch, CHAR_DATA *victim, int dam, unsigned int dt, OBJ_DATA *obj );
ch_ret one_hit( CHAR_DATA *ch, CHAR_DATA *victim, int dt );
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 );
ch_ret damage( CHAR_DATA *ch, CHAR_DATA *victim, OBJ_DATA *weapon, int dam, int dt, bool candameq );
int align_compute( CHAR_DATA *gch, CHAR_DATA *victim );
int ris_damage( CHAR_DATA *ch, short dam, int ris );
bool in_arena( CHAR_DATA *ch );
bool is_safe( CHAR_DATA *ch, CHAR_DATA *victim, bool show_messg );
bool legal_loot( CHAR_DATA *ch, CHAR_DATA *victim );
bool is_fearing( CHAR_DATA *ch, CHAR_DATA *victim );
bool is_hating( CHAR_DATA *ch, CHAR_DATA *victim );
bool is_hunting( CHAR_DATA *ch, CHAR_DATA *victim );
/*------------*/
/* Fish.c */
void free_all_fnames( void );
void load_fnames( void );
void free_all_fish( void );
void update_fishing( void );
bool stop_obj_fishing( OBJ_DATA *obj );
bool stop_fishing( CHAR_DATA *ch );
/*------------*/
/* Friends.c */
FRIEND_DATA *find_friend( CHAR_DATA *ch, char *fname );
FRIEND_DATA *add_friend( CHAR_DATA *ch, char *fname );
void send_friend_info( CHAR_DATA *ch, char *message );
void free_all_friends( CHAR_DATA *ch );
/*------------*/
/* Handler.c */
extern CHAR_DATA *cur_char;
extern bool cur_char_died;
extern ch_ret global_retcode;
extern int falling;
CHAR_DATA *get_char_room( CHAR_DATA *ch, char *argument );
CHAR_DATA *get_char_world( CHAR_DATA *ch, char *argument );
CHAR_DATA *room_is_dnd( CHAR_DATA *ch, ROOM_INDEX_DATA *pRoomIndex );
TIMER *get_timerptr( CHAR_DATA *ch, short type );
OBJ_DATA *get_obj_carry( CHAR_DATA *ch, char *argument );
OBJ_DATA *get_eq_char( CHAR_DATA *ch, int iWear );
OBJ_DATA *get_obj_wear( CHAR_DATA *ch, char *argument );
OBJ_DATA *new_get_obj_here( int type, CHAR_DATA *ch, char *argument );
OBJ_DATA *get_obj_here( CHAR_DATA *ch, char *argument );
OBJ_DATA *obj_to_room( OBJ_DATA *obj, ROOM_INDEX_DATA *pRoomIndex );
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 *obj_to_char( OBJ_DATA *obj, CHAR_DATA *ch );
OBJ_DATA *get_objtype( CHAR_DATA *ch, short type );
OBJ_DATA *obj_to_obj( OBJ_DATA *obj, OBJ_DATA *obj_to );
OBJ_DATA *get_obj_world( CHAR_DATA *ch, char *argument );
OBJ_DATA *group_object( OBJ_DATA *obj1, OBJ_DATA *obj2 );
OBJ_DATA *get_trap( OBJ_DATA *obj );
OBJ_DATA *clone_object( OBJ_DATA *obj );
OBJ_DATA *get_obj_vnum( CHAR_DATA *ch, int vnum );
OBJ_DATA *find_obj( CHAR_DATA *ch, char *argument, bool carryonly );
AREA_DATA *get_area_obj( OBJ_INDEX_DATA *pObjIndex );
AREA_DATA *get_area( char *name );
char *distime( time_t updated );
char *affect_loc_name( int location );
char *shorttime( time_t updated );
const char *pull_type_name( int pulltype );
const char *dis_race_name( int race );
const char *dis_main_class_name( CHAR_DATA *ch );
const char *dis_class_name( int Class );
void affect_remove( CHAR_DATA *ch, AFFECT_DATA *paf );
void extract_timer( CHAR_DATA *ch, TIMER *timer );
void clean_room( ROOM_INDEX_DATA *room );
void clean_obj( OBJ_INDEX_DATA *obj );
void free_teleports( void );
void affect_to_char( CHAR_DATA *ch, AFFECT_DATA *paf );
void clean_char_queue( void );
void clean_mob( MOB_INDEX_DATA *mob );
void set_cur_char( CHAR_DATA *ch );
void add_timer( CHAR_DATA *ch, short type, int count, DO_FUN *fun, int value );
void extract_exit( ROOM_INDEX_DATA *room, EXIT_DATA *pexit );
void write_corpses( OBJ_DATA *obj, bool dontsave );
void affect_modify( CHAR_DATA *ch, AFFECT_DATA *paf, bool fAdd );
void affect_join( CHAR_DATA *ch, AFFECT_DATA *paf );
void add_kill( CHAR_DATA *ch, CHAR_DATA *mob );
void split_obj( OBJ_DATA *obj, int num );
void equip_char( CHAR_DATA *ch, OBJ_DATA *obj, int iWear );
void unequip_char( CHAR_DATA *ch, OBJ_DATA *obj );
void separate_obj( OBJ_DATA *obj );
void extract_char( CHAR_DATA *ch, bool fPull );
void obj_from_obj( OBJ_DATA *obj );
void wait_state( CHAR_DATA *ch, int npulse );
void remove_file( const char *filename );
void save_char_obj( CHAR_DATA *ch );
void remove_timer( CHAR_DATA *ch, short type );
void update_aris( CHAR_DATA *ch );
void affect_strip( CHAR_DATA *ch, int sn );
void set_base_stats( CHAR_DATA *ch );
void char_from_room( CHAR_DATA *ch );
void char_to_room( CHAR_DATA *ch, ROOM_INDEX_DATA *pRoomIndex );
void obj_from_char( OBJ_DATA *obj );
void extract_obj( OBJ_DATA *obj );
void obj_from_room( OBJ_DATA *obj );
void check_chareq( CHAR_DATA *ch );
void queue_extracted_char( CHAR_DATA *ch, bool extract );
void worsen_mental_state( CHAR_DATA *ch, int mod );
void apply_ac( CHAR_DATA *ch, OBJ_DATA *obj, int iWear, bool remove );
ch_ret check_room_for_traps( CHAR_DATA *ch, int flag );
ch_ret check_for_trap( CHAR_DATA *ch, OBJ_DATA *obj, int flag );
ch_ret spring_trap( CHAR_DATA *ch, OBJ_DATA *obj );
int can_carry_n( CHAR_DATA *ch );
int get_obj_weight( OBJ_DATA *obj );
int can_carry_w( CHAR_DATA *ch );
int get_obj_number( OBJ_DATA *obj );
int get_real_obj_weight( OBJ_DATA *obj );
int times_killed( CHAR_DATA *ch, CHAR_DATA *mob );
short get_birth_year( CHAR_DATA *ch, short age );
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 );
short get_timer( CHAR_DATA *ch, short type );
short get_trust( CHAR_DATA *ch );
short get_age( CHAR_DATA *ch );
short get_perm_stat( int stat, CHAR_DATA *ch );
short get_mod_stat( int stat, CHAR_DATA *ch );
bool in_hard_range( CHAR_DATA *ch, AREA_DATA *tarea );
bool is_devoted( CHAR_DATA *ch );
bool is_trapped( OBJ_DATA *obj );
bool is_affected( CHAR_DATA *ch, int sn );
bool ms_find_obj( CHAR_DATA *ch );
bool chance( CHAR_DATA *ch, short percent );
bool can_astral( CHAR_DATA *ch, CHAR_DATA *victim );
bool is_good( CHAR_DATA *ch );
bool is_evil( CHAR_DATA *ch );
bool is_neutral( CHAR_DATA *ch );
bool is_clanned( CHAR_DATA *ch );
bool is_nationed( CHAR_DATA *ch );
bool is_counciled( CHAR_DATA *ch );
bool in_magic_container( OBJ_DATA *obj );
bool empty_obj( OBJ_DATA *obj, OBJ_DATA *destobj, ROOM_INDEX_DATA *destroom );
bool is_obj_stat( OBJ_DATA *obj, int stat );
bool room_is_dark( ROOM_INDEX_DATA *pRoomIndex );
bool room_is_private( ROOM_INDEX_DATA *pRoomIndex );
bool can_see_obj( CHAR_DATA *ch, OBJ_DATA *obj );
bool is_guest( CHAR_DATA *ch );
bool can_wear( OBJ_DATA *obj, int part );
bool nifty_is_name( char *str, char *namelist );
bool nifty_is_name_prefix( char *str, char *namelist );
bool is_name( const char *str, char *namelist );
bool is_retired( CHAR_DATA *ch );
bool char_died( CHAR_DATA *ch );
bool is_awake( CHAR_DATA *ch );
bool is_floating( CHAR_DATA *ch );
bool is_pkill( CHAR_DATA *ch );
bool check_subrestricted( CHAR_DATA *ch );
bool can_go( ROOM_INDEX_DATA *room, int door );
bool is_drunk( CHAR_DATA *ch, int drunk );
bool can_pkill( CHAR_DATA *ch );
bool can_drop_room( CHAR_DATA *ch );
bool can_drop_obj( CHAR_DATA *ch, OBJ_DATA *obj );
bool is_vampire( CHAR_DATA *ch );
bool is_outside( CHAR_DATA *ch );
bool valid_pfile( const char *filename );
bool can_see( CHAR_DATA *ch, CHAR_DATA *victim );
bool can_take_proto( CHAR_DATA *ch );
bool is_valid_pers( int sn );
bool is_valid_herb( int sn );
bool is_valid_sn( int sn );
bool is_idle( CHAR_DATA *ch );
bool is_pacifist( CHAR_DATA *ch );
bool no_weather_sect( ROOM_INDEX_DATA *room );
/*------------*/
/* Hashstr.c */
char *quick_link( const char *str, const char *filename, int line );
char *str_alloc( const char *str, const char *filename, int line );
char *check_hash( const char *str );
char *hash_stats( void );
void show_high_hash( int top );
int str_free( const char *str, const char *filename, int line );
bool in_hash_table( const char *str );
bool hash_dump( int hash );
/*------------*/
/* Helps.c */
extern int top_help;
CMDF( do_help );
struct help_data *get_help( CHAR_DATA *ch, char *argument );
char *un_fix_help( char *text );
char *help_fix( char *text );
void add_skill_help( SKILLTYPE *skill, bool update );
void update_skill_helps( void );
void update_command_helps( void );
void load_helps( void );
void add_command_help( CMDTYPE *cmd, bool update );
void free_helps( void );
bool valid_help( char *argument );
/*------------*/
/* Highscore.c */
void load_highscores( void );
void free_hightables( void );
/*------------*/
/* Hint.c */
void load_hints( void );
void free_hints( void );
/*------------*/
/* Host.c */
bool check_host( CHAR_DATA *ch );
/*------------*/
/* Hostlist.c */
void load_hostlog( void );
void free_all_hostlogs( void );
void handle_hostlog( const char *message, CHAR_DATA *ch );
/*------------*/
/* Interp.c */
extern bool fLogAll;
extern CMDTYPE *command_hash[126];
extern SOCIALTYPE *social_index[126];
char *one_argument( char *argument, char *arg_first );
char *one_argument2( char *argument, char *arg_first );
char *check_cmd_flags( CHAR_DATA *ch, CMDTYPE *cmd );
void update_userec( struct timeval *time_used, struct timerset *userec );
void start_timer( struct timeval *sttime );
void send_timer( struct timerset *vtime, CHAR_DATA *ch );
void interpret( CHAR_DATA *ch, char *argument );
void interpret_printf( CHAR_DATA *ch, const char *fmt, ... ) __attribute__ ( ( format( printf, 2, 3 ) ) );
time_t end_timer( struct timeval *sttime );
int number_argument( char *argument, char *arg );
bool is_number( char *arg );
/*------------*/
/* Lockers.c */
void load_lockershares( void );
void check_lockers( void );
void rename_locker( CHAR_DATA *ch, char *newname );
void rename_lockershare( char *name, char *newname );
void free_all_lockershare( void );
bool is_locker_shared( char *name );
/*------------*/
/* News.c */
void free_all_news( void );
/*------------*/
/* Magic.c */
extern char *target_name;
extern char *ranged_target_name;
CMDF( do_cast );
ch_ret spell_affectchar( int sn, int level, CHAR_DATA *ch, void *vo );
ch_ret obj_cast_spell( int sn, int level, CHAR_DATA *ch, CHAR_DATA *victim, OBJ_DATA *obj );
int bsearch_skill_exact( const char *name, int first, int top );
int bsearch_skill_prefix( const char *name, int first, int top );
int herb_lookup( const char *name );
int pers_lookup( const char *name );
int dice_parse( CHAR_DATA *ch, CHAR_DATA *victim, int level, char *texp );
int slot_lookup( int slot );
int skill_lookup( const char *name );
bool saves_spell_staff( int level, CHAR_DATA *victim );
bool saves_poison_death( int level, CHAR_DATA *victim );
/*------------*/
/* Makeobjs.c */
OBJ_DATA *make_trap( int v0, int v1, int v2, int v3 );
OBJ_DATA *make_corpse( CHAR_DATA *ch, CHAR_DATA *killer );
OBJ_DATA *create_money( int amount );
void make_bloodstain( OBJ_DATA *obj, ROOM_INDEX_DATA *room );
void make_blood( CHAR_DATA *ch );
void set_money( OBJ_DATA *obj, int amount );
void make_scraps( OBJ_DATA *obj );
/*------------*/
/* Mccp.c */
extern int mccpusers;
/*------------*/
/* Misc.c */
CMDF( do_quaff );
EXT_BV meb( int bit );
EXT_BV fread_bitvector( FILE *fp );
void actiondesc( CHAR_DATA *ch, OBJ_DATA *obj );
/*------------*/
/* Mud_comm.c */
const char *mprog_type_to_name( int type );
void load_mpdamages( void );
void free_all_mpdamages( void );
int get_color( char *argument );
/*------------*/
/* Mud_prog.c */
extern struct act_prog_data *mob_act_list;
extern OBJ_DATA *supermob_obj;
extern CHAR_DATA *supermob;
void init_supermob( void );
void free_prog_actlists( void );
void progbug( const char *str, CHAR_DATA *mob );
void progbug_printf( CHAR_DATA *mob, const char *fmt, ... ) __attribute__ ( ( format( printf, 2, 3 ) ) );
void mprog_entry_trigger( CHAR_DATA *mob );
void mprog_hitprcnt_trigger( CHAR_DATA *mob, CHAR_DATA *ch );
void mprog_greet_trigger( CHAR_DATA *ch );
void mprog_speech_trigger( char *txt, CHAR_DATA *actor );
void mprog_bribe_trigger( CHAR_DATA *mob, CHAR_DATA *ch, int amount );
void mprog_give_trigger( CHAR_DATA *mob, CHAR_DATA *ch, OBJ_DATA *obj );
void mprog_act_trigger( char *buf, CHAR_DATA *mob, CHAR_DATA *ch, OBJ_DATA *obj, void *vo );
void mprog_death_trigger( CHAR_DATA *killer, CHAR_DATA *mob );
void mprog_fight_trigger( CHAR_DATA *mob, CHAR_DATA *ch );
void oprog_scrap_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_zap_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_fight_trigger( CHAR_DATA *ch );
void oprog_act_trigger( char *buf, OBJ_DATA *mobj, CHAR_DATA *ch, OBJ_DATA *obj, void *vo );
void oprog_speech_trigger( char *txt, CHAR_DATA *ch );
void oprog_examine_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_greet_trigger( CHAR_DATA *ch );
void oprog_open_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 );
void oprog_close_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_wear_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_damage_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_sac_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_wordlist_check( char *arg, CHAR_DATA *mob, CHAR_DATA *actor, OBJ_DATA *obj, void *vo, int type, OBJ_DATA *iobj );
void oprog_drop_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_remove_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_put_trigger( CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *container );
void oprog_get_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void rprog_wordlist_check( char *arg, CHAR_DATA *mob, CHAR_DATA *actor, OBJ_DATA *obj, void *vo, int type, ROOM_INDEX_DATA *room );
void rprog_rfight_trigger( CHAR_DATA *ch );
void rprog_act_trigger( char *buf, ROOM_INDEX_DATA *room, CHAR_DATA *ch, OBJ_DATA *obj, void *vo );
void rprog_leave_trigger( CHAR_DATA *ch );
void rprog_enter_trigger( CHAR_DATA *ch );
void rprog_speech_trigger( char *txt, CHAR_DATA *ch );
void rprog_sleep_trigger( CHAR_DATA *ch );
void rprog_rest_trigger( CHAR_DATA *ch );
void rprog_death_trigger( CHAR_DATA *ch );
void room_act_add( ROOM_INDEX_DATA *room );
void obj_act_add( OBJ_DATA *obj );
void set_supermob( OBJ_DATA *obj );
void rset_supermob( ROOM_INDEX_DATA *room );
void release_supermob( void );
int mprog_do_command( char *cmnd, CHAR_DATA *mob, CHAR_DATA *actor, OBJ_DATA *obj, void *vo, CHAR_DATA *rndm, bool ignore, bool ignore_ors );
bool oprog_use_trigger( CHAR_DATA *ch, OBJ_DATA *obj, CHAR_DATA *vict, OBJ_DATA *targ );
/*------------*/
/* Mwresets.c */
void load_mwresets( void );
void free_all_mwresets( void );
void handle_mwreset( OBJ_DATA *corpse );
void handle_mwmobilereset( ROOM_INDEX_DATA *room );
/*------------*/
/* News.c */
void load_news( void );
/*------------*/
/* Player.c */
CMDF( do_pushup );
CMDF( do_situp );
void set_title( CHAR_DATA *ch, char *title );
void handle_stat( CHAR_DATA *ch, short stat, bool silence, short chance );
/*------------*/
/* Polymorph.c */
MORPH_DATA *find_morph( CHAR_DATA *ch, char *target, bool is_cast );
MORPH_DATA *get_morph( char *arg );
MORPH_DATA *get_morph_vnum( int vnum );
void show_morphs( CHAR_DATA *ch );
void do_unmorph_char( CHAR_DATA *ch );
void load_morphs( void );
void free_morphs( void );
int do_morph_char( CHAR_DATA *ch, MORPH_DATA *morph );
/*------------*/
/* Quest.c */
void load_rewards( void );
void free_rewards( void );
/*------------*/
/* Races.c */
extern int MAX_PC_RACE;
extern struct race_type *race_table[MAX_RACE];
void load_races( void );
void write_race_file( int ra );
/*------------*/
/* Reserved.c */
void load_reserved( void );
void free_all_reserved( void );
bool is_reserved_name( char *name );
/*------------*/
/* Reset.c */
RESET_DATA *add_reset( ROOM_INDEX_DATA *room, char letter, int extra, int arg1, int arg2, int arg3, short rchance, short xcord, short ycord, bool wilderness );
char *sprint_reset( RESET_DATA *pReset, short *num );
void delete_reset( RESET_DATA *pReset );
void wipe_resets( ROOM_INDEX_DATA *room );
void renumber_put_resets( ROOM_INDEX_DATA *room );
void reset_area( AREA_DATA *area );
/*------------*/
/* Save.c */
extern CHAR_DATA *quitting_char;
extern CHAR_DATA *loading_char;
extern CHAR_DATA *saving_char;
void load_corpses( void );
void set_alarm( long seconds );
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 );
bool load_char_obj( DESCRIPTOR_DATA *d, char *name, bool preload, bool copyover );
/*------------*/
/* Skills.c */
CMDF( skill_notfound );
CMDF( do_dig );
CMDF( do_search );
CMDF( do_detrap );
CMDF( do_recall );
CMDF( do_bash );
CMDF( do_stun );
CMDF( do_gouge );
CMDF( do_feed );
SKILLTYPE *new_skill( void );
SKILLTYPE *get_skilltype( int sn );
void depierce_equipment( CHAR_DATA *ch, int iWear );
void check_reqs( void );
void free_skills( void );
void trip( CHAR_DATA *ch, CHAR_DATA *victim );
void disarm( CHAR_DATA *ch, CHAR_DATA *victim );
void learn_from_success( CHAR_DATA *ch, int sn );
void learn_from_failure( CHAR_DATA *ch, int sn );
int get_adept( CHAR_DATA *ch, int sn );
int first_learned( CHAR_DATA *ch, int sn );
int mana_cost( CHAR_DATA *ch, int sn );
int get_possible_adept( CHAR_DATA *ch, int sn );
bool check_skill( CHAR_DATA *ch, char *command, char *argument );
bool check_duck( CHAR_DATA *ch, CHAR_DATA *victim );
bool check_tumble( CHAR_DATA *ch, CHAR_DATA *victim );
bool check_shieldblock( CHAR_DATA *ch, CHAR_DATA *victim );
bool check_parry( CHAR_DATA *ch, CHAR_DATA *victim );
bool check_dodge( CHAR_DATA *ch, CHAR_DATA *victim );
bool check_counter( CHAR_DATA *ch, CHAR_DATA *victim, int dam );
bool check_block( CHAR_DATA *ch, CHAR_DATA *victim );
bool can_practice( CHAR_DATA *ch, int sn );
/*------------*/
/* Socials.c */
SOCIALTYPE *find_social( const char *command, bool exact );
void load_socials( void );
void free_socials( void );
bool check_social( CHAR_DATA *ch, const char *command, char *argument );
/*------------*/
/* Special.c */
SPEC_FUN *spec_lookup( char *name );
void load_specfuns( void );
void free_specfuns( void );
bool validate_spec_fun( char *name );
bool is_fighting( CHAR_DATA *ch );
/*------------*/
/* Storages.c */
void load_storages( void );
void save_storage( ROOM_INDEX_DATA *room );
/*------------*/
/* Sysdata.c */
void load_systemdata( void );
void save_sysdata( bool autosave );
/*------------*/
/* Tables.c */
extern LANG_DATA *first_lang, *last_lang;
extern int top_sn;
extern int top_herb;
extern int top_pers;
extern SKILLTYPE *herb_table[MAX_HERB];
extern SKILLTYPE *pers_table[MAX_PERS];
extern SKILLTYPE *skill_table[MAX_SKILL];
extern const char *const skill_tname[];
DO_FUN *skill_function( char *name );
void remap_slot_numbers( void );
void sort_skill_table( void );
void load_skill_table( void );
void load_herb_table( void );
void load_pers_table( void );
void load_tongues( void );
void free_tongues( void );
/*------------*/
/* Timeinfo.c */
char *show_birthday( CHAR_DATA *ch );
void load_calendarinfo( void );
void load_timeinfo( void );
void free_all_calendarinfo( void );
/*------------*/
/* Transfer.c */
void create_transfer( void );
void load_transfer( void );
void update_transfer( int type, int size );
void free_transfer( void );
/*------------*/
/* Trivia.c */
void load_trivia( void );
void stop_trivia( void );
void free_all_trivias( void );
/*------------*/
/* Update.c */
extern CHAR_DATA *gch_prev;
extern OBJ_DATA *gobj_prev;
bool weight_check( CHAR_DATA *ch, OBJ_DATA *obj );
void remove_portal( OBJ_DATA *portal );
void aggr_room_update( CHAR_DATA *wch, ROOM_INDEX_DATA *room );
void weather_update( void );
void update_handler( void );
void gain_condition( CHAR_DATA *ch, int iCond, int value );
void subtract_times( struct timeval *etime, struct timeval *sttime );
/*------------*/
/* Wilderness.c */
extern bool loc_in_wilderness;
extern int loc_cords[2];
void set_loc_cords( CHAR_DATA *ch );
void char_to_char_cords( CHAR_DATA *ch, CHAR_DATA *victim );
void put_in_wilderness( CHAR_DATA *ch, short x, short y );
void obj_to_char_cords( OBJ_DATA *obj, CHAR_DATA *ch );
void parse_wilderness_description( CHAR_DATA *ch, char *str );
void move_around_wilderness( CHAR_DATA *ch, short dir, char *str );
bool is_in_wilderness( CHAR_DATA *ch );
bool can_see_character( CHAR_DATA *ch, CHAR_DATA *rch );
/*------------*/