/**************************************************************************** * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | \\._.// * * -----------------------------------------------------------| (0...0) * * SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by Derek Snider | ).:.( * * -----------------------------------------------------------| {o o} * * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, | / ' ' \ * * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek, |~'~.VxvxV.~'~* * Tricops and Fireblade | * * ------------------------------------------------------------------------ * * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * 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 #ifdef __cplusplus #include <typeinfo> #endif #ifndef __cplusplus typedef unsigned char bool; #define true 1 #define false 0 #endif #define args( list ) list #define KEY( literal, field, value ) \ if ( !str_cmp( word, (literal) ) ) \ { \ (field) = (value); \ fMatch = true; \ break; \ } /* * Structure types. */ typedef struct affect_data AFFECT_DATA; typedef struct area_data AREA_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 obj_index_data OBJ_INDEX_DATA; typedef struct reset_data RESET_DATA; typedef struct room_index_data ROOM_INDEX_DATA; typedef struct shop_data SHOP_DATA; typedef struct repairshop_data REPAIR_DATA; typedef struct hour_min_sec HOUR_MIN_SEC; typedef struct mob_prog_data MPROG_DATA; typedef struct mob_prog_act_list MPROG_ACT_LIST; typedef struct smaug_affect SMAUG_AFF; typedef struct skill_type SKILLTYPE; typedef struct extended_bitvector EXT_BV; #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 MAX_KEY_HASH 2048 #define MAX_STRING_LENGTH 4096 /* buf */ #define MAX_INPUT_LENGTH 1024 /* arg */ #define MAX_INBUF_SIZE 1024 #define MSL MAX_STRING_LENGTH #define MIL MAX_INPUT_LENGTH #define HASHSTR /* use string hashing */ #define MAX_REXITS 20 /* Maximum exits allowed in 1 room */ #define MAX_SKILL 500 #define MAX_LEVEL 65 #define LEVEL_LESSER (MAX_LEVEL - 8) #define LEVEL_LOG LEVEL_LESSER /* Stuff for area versions --Shaddai */ #define HAS_SPELL_INDEX -1 /* Command logging types. */ typedef enum { LOG_NORMAL, LOG_ALWAYS, LOG_NEVER, LOG_BUILD, LOG_HIGH, LOG_COMM, LOG_WARN, LOG_ALL } log_types; /* 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 { unsigned int bits[XBI]; }; /* * Shop types. */ #define MAX_TRADE 5 struct shop_data { SHOP_DATA *next; /* Next shop in list */ SHOP_DATA *prev; /* Previous shop in list */ int keeper; /* Vnum of shop keeper mob */ short buy_type[MAX_TRADE]; /* Item types shop will buy */ short profit_buy; /* Cost multiplier for buying */ short profit_sell; /* Cost multiplier for selling */ short open_hour; /* First opening hour */ short close_hour; /* First closing hour */ }; #define MAX_FIX 3 #define SHOP_FIX 1 #define SHOP_RECHARGE 2 struct repairshop_data { REPAIR_DATA *next; /* Next shop in list */ REPAIR_DATA *prev; /* Previous shop in list */ int keeper; /* Vnum of shop keeper mob */ short fix_type[MAX_FIX]; /* Item types shop will fix */ short profit_fix; /* Cost multiplier for fixing */ short shop_type; /* Repair shop type */ short open_hour; /* First opening hour */ short close_hour; /* First closing hour */ }; /* Mob program structures */ struct act_prog_data { struct act_prog_data *next; void *vo; }; struct mob_prog_act_list { MPROG_ACT_LIST *next; const char *buf; const void *vo; }; struct mob_prog_data { MPROG_DATA *next; short type; bool triggered; int resetdelay; const char *arglist; const char *comlist; bool fileprog; }; /* * An affect. * * So limited... so few fields... should we add more? */ struct affect_data { AFFECT_DATA *next; AFFECT_DATA *prev; short type; int duration; short location; int modifier; EXT_BV bitvector; }; /* * A SMAUG spell */ struct smaug_affect { SMAUG_AFF *next; SMAUG_AFF *prev; const char *duration; short location; const char *modifier; int bitvector; /* this is the bit number */ }; /*************************************************************************** * * * VALUES OF INTEREST TO AREA BUILDERS * * (Start of section ... start here) * * * ***************************************************************************/ /* * ACT bits for mobs. * Used in #MOBILES. */ #define ACT_IS_NPC 0 /* Auto set for mobs */ #define ACT_SENTINEL 1 /* Stays in one room */ #define ACT_SCAVENGER 2 /* Picks up objects */ /* 3 is available for use */ /* 4 is available for use */ #define ACT_AGGRESSIVE 5 /* Attacks PC's */ #define ACT_STAY_AREA 6 /* Won't leave area */ #define ACT_WIMPY 7 /* Flees when hurt */ #define ACT_PET 8 /* Auto set for pets */ #define ACT_TRAIN 9 /* Can train PC's */ #define ACT_PRACTICE 10 /* Can practice PC's */ #define ACT_IMMORTAL 11 /* Cannot be killed */ #define ACT_DEADLY 12 /* Has a deadly poison */ #define ACT_POLYSELF 13 #define ACT_META_AGGR 14 /* Attacks other mobs */ #define ACT_GUARDIAN 15 /* Protects master */ #define ACT_RUNNING 16 /* Hunts quickly */ #define ACT_NOWANDER 17 /* Doesn't wander */ #define ACT_MOUNTABLE 18 /* Can be mounted */ #define ACT_MOUNTED 19 /* Is mounted */ #define ACT_SCHOLAR 20 /* Can teach languages */ #define ACT_SECRETIVE 21 /* actions aren't seen */ #define ACT_HARDHAT 22 /* Immune to falling item damage */ #define ACT_MOBINVIS 23 /* Like wizinvis */ #define ACT_NOASSIST 24 /* Doesn't assist mobs */ #define ACT_AUTONOMOUS 25 /* Doesn't auto switch tanks */ #define ACT_PACIFIST 26 /* Doesn't ever fight */ #define ACT_NOATTACK 27 /* No physical attacks */ #define ACT_ANNOYING 28 /* Other mobs will attack */ #define ACT_STATSHIELD 29 /* prevent statting */ #define ACT_PROTOTYPE 30 /* A prototype mob */ /* 28 acts */ /* * Bits for 'affected_by'. * Used in #MOBILES. * * hold and flaming are yet uncoded */ typedef enum { AFF_BLIND, AFF_INVISIBLE, AFF_DETECT_EVIL, AFF_DETECT_INVIS, AFF_DETECT_MAGIC, AFF_DETECT_HIDDEN, AFF_HOLD, AFF_SANCTUARY, AFF_FAERIE_FIRE, AFF_INFRARED, AFF_CURSE, AFF_FLAMING, AFF_POISON, AFF_PROTECT, AFF_PARALYSIS, AFF_SNEAK, AFF_HIDE, AFF_SLEEP, AFF_CHARM, AFF_FLYING, AFF_PASS_DOOR, AFF_FLOATING, AFF_TRUESIGHT, AFF_DETECTTRAPS, AFF_SCRYING, AFF_FIRESHIELD, AFF_SHOCKSHIELD, AFF_HAUS1, AFF_ICESHIELD, AFF_POSSESS, AFF_BERSERK, AFF_AQUA_BREATH, AFF_RECURRINGSPELL, AFF_CONTAGIOUS, AFF_ACIDMIST, AFF_VENOMSHIELD, MAX_AFFECTED_BY } affected_by_types; /* * Resistant Immune Susceptible flags */ #define RIS_FIRE BV00 #define RIS_COLD BV01 #define RIS_ELECTRICITY BV02 #define RIS_ENERGY BV03 #define RIS_BLUNT BV04 #define RIS_PIERCE BV05 #define RIS_SLASH BV06 #define RIS_ACID BV07 #define RIS_POISON BV08 #define RIS_DRAIN BV09 #define RIS_SLEEP BV10 #define RIS_CHARM BV11 #define RIS_HOLD BV12 #define RIS_NONMAGIC BV13 #define RIS_PLUS1 BV14 #define RIS_PLUS2 BV15 #define RIS_PLUS3 BV16 #define RIS_PLUS4 BV17 #define RIS_PLUS5 BV18 #define RIS_PLUS6 BV19 #define RIS_MAGIC BV20 #define RIS_PARALYSIS BV21 /* 21 RIS's*/ /* * Attack types */ typedef enum { ATCK_BITE, ATCK_CLAWS, ATCK_TAIL, ATCK_STING, ATCK_PUNCH, ATCK_KICK, ATCK_TRIP, ATCK_BASH, ATCK_STUN, ATCK_GOUGE, ATCK_BACKSTAB, ATCK_FEED, ATCK_DRAIN, ATCK_FIREBREATH, ATCK_FROSTBREATH, ATCK_ACIDBREATH, ATCK_LIGHTNBREATH, ATCK_GASBREATH, ATCK_POISON, ATCK_NASTYPOISON, ATCK_GAZE, ATCK_BLINDNESS, ATCK_CAUSESERIOUS, ATCK_EARTHQUAKE, ATCK_CAUSECRITICAL, ATCK_CURSE, ATCK_FLAMESTRIKE, ATCK_HARM, ATCK_FIREBALL, ATCK_COLORSPRAY, ATCK_WEAKEN, ATCK_SPIRALBLAST, MAX_ATTACK_TYPE } attack_types; /* * Defense types */ typedef enum { DFND_PARRY, DFND_DODGE, DFND_HEAL, DFND_CURELIGHT, DFND_CURESERIOUS, DFND_CURECRITICAL, DFND_DISPELMAGIC, DFND_DISPELEVIL, DFND_SANCTUARY, DFND_FIRESHIELD, DFND_SHOCKSHIELD, DFND_SHIELD, DFND_BLESS, DFND_STONESKIN, DFND_TELEPORT, DFND_MONSUM1, DFND_MONSUM2, DFND_MONSUM3, DFND_MONSUM4, DFND_DISARM, DFND_ICESHIELD, DFND_GRIP, DFND_TRUESIGHT, DFND_ACIDMIST, DFND_VENOMSHIELD, MAX_DEFENSE_TYPE } defense_types; /* * Body parts */ #define PART_HEAD BV00 #define PART_ARMS BV01 #define PART_LEGS BV02 #define PART_HEART BV03 #define PART_BRAINS BV04 #define PART_GUTS BV05 #define PART_HANDS BV06 #define PART_FEET BV07 #define PART_FINGERS BV08 #define PART_EAR BV09 #define PART_EYE BV10 #define PART_LONG_TONGUE BV11 #define PART_EYESTALKS BV12 #define PART_TENTACLES BV13 #define PART_FINS BV14 #define PART_WINGS BV15 #define PART_TAIL BV16 #define PART_SCALES BV17 /* for combat */ #define PART_CLAWS BV18 #define PART_FANGS BV19 #define PART_HORNS BV20 #define PART_TUSKS BV21 #define PART_TAILATTACK BV22 #define PART_SHARPSCALES BV23 #define PART_BEAK BV24 #define PART_HAUNCH BV25 #define PART_HOOVES BV26 #define PART_PAWS BV27 #define PART_FORELEGS BV28 #define PART_FEATHERS BV29 /* old flags for conversion purposes -- will not conflict with the flags below */ #define OLD_SF_SAVE_HALF_DAMAGE BV18 /* old save for half damage */ #define OLD_SF_SAVE_NEGATES BV19 /* old save negates affect */ /* Skill/Spell flags The minimum BV *MUST* be 11! */ #define SF_WATER BV00 #define SF_EARTH BV01 #define SF_AIR BV02 #define SF_ASTRAL BV03 #define SF_AREA BV04 /* is an area spell */ #define SF_DISTANT BV05 /* affects something far away */ #define SF_REVERSE BV06 #define SF_NOSELF BV07 /* Can't target yourself! */ #define SF_UNUSED2 BV08 /* free for use! */ #define SF_ACCUMULATIVE BV09 /* is accumulative */ #define SF_RECASTABLE BV10 /* can be refreshed */ #define SF_NOSCRIBE BV11 /* cannot be scribed */ #define SF_NOBREW BV12 /* cannot be brewed */ #define SF_GROUPSPELL BV13 /* only affects group members */ #define SF_OBJECT BV14 /* directed at an object */ #define SF_CHARACTER BV15 /* directed at a character */ #define SF_SECRETSKILL BV16 /* hidden unless learned */ #define SF_PKSENSITIVE BV17 /* much harder for plr vs. plr */ #define SF_STOPONFAIL BV18 /* stops spell on first failure */ #define SF_NOFIGHT BV19 /* stops if char fighting */ #define SF_NODISPEL BV20 /* stops spell from being dispelled */ #define SF_RANDOMTARGET BV21 /* chooses a random target */ typedef enum { SS_NONE, SS_POISON_DEATH, SS_ROD_WANDS, SS_PARA_PETRI, SS_BREATH, SS_SPELL_STAFF } save_types; #define ALL_BITS INT_MAX #define SDAM_MASK ALL_BITS & ~(BV00 | BV01 | BV02) #define SACT_MASK ALL_BITS & ~(BV03 | BV04 | BV05) #define SCLA_MASK ALL_BITS & ~(BV06 | BV07 | BV08) #define SPOW_MASK ALL_BITS & ~(BV09 | BV10) #define SSAV_MASK ALL_BITS & ~(BV11 | BV12 | BV13) typedef enum { SD_NONE, SD_FIRE, SD_COLD, SD_ELECTRICITY, SD_ENERGY, SD_ACID, SD_POISON, SD_DRAIN } spell_dam_types; typedef enum { SA_NONE, SA_CREATE, SA_DESTROY, SA_RESIST, SA_SUSCEPT, SA_DIVINATE, SA_OBSCURE, SA_CHANGE } spell_act_types; typedef enum { SP_NONE, SP_MINOR, SP_GREATER, SP_MAJOR } spell_power_types; typedef enum { SC_NONE, SC_LUNAR, SC_SOLAR, SC_TRAVEL, SC_SUMMON, SC_LIFE, SC_DEATH, SC_ILLUSION } spell_class_types; typedef enum { SE_NONE, SE_NEGATE, SE_EIGHTHDAM, SE_QUARTERDAM, SE_HALFDAM, SE_3QTRDAM, SE_REFLECT, SE_ABSORB } spell_save_effects; /* * Sex. * Used in #MOBILES. */ typedef enum { SEX_NEUTRAL, SEX_MALE, SEX_FEMALE } sex_types; #define TRAP_ROOM BV00 #define TRAP_OBJ BV01 #define TRAP_ENTER_ROOM BV02 #define TRAP_LEAVE_ROOM BV03 #define TRAP_OPEN BV04 #define TRAP_CLOSE BV05 #define TRAP_GET BV06 #define TRAP_PUT BV07 #define TRAP_PICK BV08 #define TRAP_UNLOCK BV09 #define TRAP_N BV10 #define TRAP_S BV11 #define TRAP_E BV12 #define TRAP_W BV13 #define TRAP_U BV14 #define TRAP_D BV15 #define TRAP_EXAMINE BV16 #define TRAP_NE BV17 #define TRAP_NW BV18 #define TRAP_SE BV19 #define TRAP_SW BV20 /* * Item types. * Used in #OBJECTS. */ typedef enum { ITEM_NONE, ITEM_LIGHT, ITEM_SCROLL, ITEM_WAND, ITEM_STAFF, ITEM_WEAPON, ITEM_FIREWEAPON, ITEM_MISSILE, ITEM_TREASURE, ITEM_ARMOR, ITEM_POTION, ITEM_WORN, ITEM_FURNITURE, ITEM_TRASH, ITEM_OLDTRAP, ITEM_CONTAINER, ITEM_NOTE, ITEM_DRINK_CON, ITEM_KEY, ITEM_FOOD, ITEM_MONEY, ITEM_PEN, ITEM_BOAT, ITEM_CORPSE_NPC, ITEM_CORPSE_PC, ITEM_FOUNTAIN, ITEM_PILL, ITEM_BLOOD, ITEM_BLOODSTAIN, ITEM_SCRAPS, ITEM_PIPE, ITEM_HERB_CON, ITEM_HERB, ITEM_INCENSE, ITEM_FIRE, ITEM_BOOK, ITEM_SWITCH, ITEM_LEVER, ITEM_PULLCHAIN, ITEM_BUTTON, ITEM_DIAL, ITEM_RUNE, ITEM_RUNEPOUCH, ITEM_MATCH, ITEM_TRAP, ITEM_MAP, ITEM_PORTAL, ITEM_PAPER, ITEM_TINDER, ITEM_LOCKPICK, ITEM_SPIKE, ITEM_DISEASE, ITEM_OIL, ITEM_FUEL, ITEM_EMPTY1, ITEM_EMPTY2, ITEM_MISSILE_WEAPON, ITEM_PROJECTILE, ITEM_QUIVER, ITEM_SHOVEL, ITEM_SALVE, ITEM_COOK, ITEM_KEYRING, ITEM_ODOR, ITEM_CHANCE, ITEM_DRINK_MIX } item_types; #define MAX_ITEM_TYPE ITEM_DRINK_MIX /* * Extra flags. * Used in #OBJECTS. */ typedef enum { ITEM_GLOW, ITEM_HUM, ITEM_DARK, ITEM_LOYAL, ITEM_EVIL, ITEM_INVIS, ITEM_MAGIC, ITEM_NODROP, ITEM_BLESS, ITEM_ANTI_GOOD, ITEM_ANTI_EVIL, ITEM_ANTI_NEUTRAL, ITEM_NOREMOVE, ITEM_INVENTORY, ITEM_ANTI_MAGE, ITEM_ANTI_THIEF, ITEM_ANTI_WARRIOR, ITEM_ANTI_CLERIC, ITEM_ORGANIC, ITEM_METAL, ITEM_DONATION, ITEM_CLANOBJECT, ITEM_CLANCORPSE, ITEM_ANTI_VAMPIRE, ITEM_ANTI_DRUID, ITEM_HIDDEN, ITEM_POISONED, ITEM_COVERING, ITEM_DEATHROT, ITEM_BURIED, ITEM_PROTOTYPE, ITEM_NOLOCATE, ITEM_GROUNDROT, ITEM_LOOTABLE, ITEM_PERSONAL, ITEM_MULTI_INVOKE, ITEM_ENCHANTED, MAX_ITEM_FLAG } item_extra_flags; /* * Wear flags. * Used in #OBJECTS. */ #define ITEM_TAKE BV00 #define ITEM_WEAR_FINGER BV01 #define ITEM_WEAR_NECK BV02 #define ITEM_WEAR_BODY BV03 #define ITEM_WEAR_HEAD BV04 #define ITEM_WEAR_LEGS BV05 #define ITEM_WEAR_FEET BV06 #define ITEM_WEAR_HANDS BV07 #define ITEM_WEAR_ARMS BV08 #define ITEM_WEAR_SHIELD BV09 #define ITEM_WEAR_ABOUT BV10 #define ITEM_WEAR_WAIST BV11 #define ITEM_WEAR_WRIST BV12 #define ITEM_WIELD BV13 #define ITEM_HOLD BV14 #define ITEM_DUAL_WIELD BV15 #define ITEM_WEAR_EARS BV16 #define ITEM_WEAR_EYES BV17 #define ITEM_MISSILE_WIELD BV18 #define ITEM_WEAR_BACK BV19 #define ITEM_WEAR_FACE BV20 #define ITEM_WEAR_ANKLE BV21 #define ITEM_WEAR_MAX 21 typedef enum { APPLY_NONE, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_WIS, APPLY_CON, APPLY_SEX, APPLY_CLASS, APPLY_LEVEL, APPLY_AGE, APPLY_HEIGHT, APPLY_WEIGHT, APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_GOLD, APPLY_EXP, APPLY_AC, APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_POISON, APPLY_SAVING_ROD, APPLY_SAVING_PARA, APPLY_SAVING_BREATH, APPLY_SAVING_SPELL, APPLY_CHA, APPLY_AFFECT, APPLY_RESISTANT, APPLY_IMMUNE, APPLY_SUSCEPTIBLE, APPLY_WEAPONSPELL, APPLY_LCK, APPLY_BACKSTAB, APPLY_PICK, APPLY_TRACK, APPLY_STEAL, APPLY_SNEAK, APPLY_HIDE, APPLY_PALM, APPLY_DETRAP, APPLY_DODGE, APPLY_PEEK, APPLY_SCAN, APPLY_GOUGE, APPLY_SEARCH, APPLY_MOUNT, APPLY_DISARM, APPLY_KICK, APPLY_PARRY, APPLY_BASH, APPLY_STUN, APPLY_PUNCH, APPLY_CLIMB, APPLY_GRIP, APPLY_SCRIBE, APPLY_BREW, APPLY_WEARSPELL, APPLY_REMOVESPELL, APPLY_EMOTION, APPLY_MENTALSTATE, APPLY_STRIPSN, APPLY_REMOVE, APPLY_DIG, APPLY_FULL, APPLY_THIRST, APPLY_DRUNK, APPLY_BLOOD, APPLY_COOK, APPLY_RECURRINGSPELL, APPLY_CONTAGIOUS, APPLY_EXT_AFFECT, APPLY_ODOR, APPLY_ROOMFLAG, APPLY_SECTORTYPE, APPLY_ROOMLIGHT, APPLY_TELEVNUM, APPLY_TELEDELAY, MAX_APPLY_TYPE } apply_types; #define REVERSE_APPLY 1000 /* * Room flags. Holy cow! Talked about stripped away.. * Used in #ROOMS. Those merc guys know how to strip code down. * Lets put it all back... ;) */ typedef enum { ROOM_DARK, ROOM_DEATH, ROOM_NO_MOB, ROOM_INDOORS, ROOM_LAWFUL, ROOM_NEUTRAL, ROOM_CHAOTIC, ROOM_NO_MAGIC, ROOM_TUNNEL, ROOM_PRIVATE, ROOM_SAFE, ROOM_SOLITARY, ROOM_PET_SHOP, ROOM_NO_RECALL, ROOM_DONATION, ROOM_NODROPALL, ROOM_SILENCE, ROOM_LOGSPEECH, ROOM_NODROP, ROOM_CLANSTOREROOM, ROOM_NO_SUMMON, ROOM_NO_ASTRAL, ROOM_TELEPORT, ROOM_TELESHOWDESC, ROOM_NOFLOOR, ROOM_NOSUPPLICATE, ROOM_ARENA, ROOM_NOMISSILE, ROOM_R4, ROOM_R5, ROOM_PROTOTYPE, ROOM_DND, ROOM_BFS_MARK, ROOM_MAX } room_flags; /* * Directions. * Used 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 */ /* * Exit flags. EX_RES# are reserved for use by the * Used in #ROOMS. SMAUG development team */ #define EX_ISDOOR BV00 #define EX_CLOSED BV01 #define EX_LOCKED BV02 #define EX_SECRET BV03 #define EX_SWIM BV04 #define EX_PICKPROOF BV05 #define EX_FLY BV06 #define EX_CLIMB BV07 #define EX_DIG BV08 #define EX_EATKEY BV09 #define EX_NOPASSDOOR BV10 #define EX_HIDDEN BV11 #define EX_PASSAGE BV12 #define EX_PORTAL BV13 #define EX_RES1 BV14 #define EX_RES2 BV15 #define EX_xCLIMB BV16 #define EX_xENTER BV17 #define EX_xLEAVE BV18 #define EX_xAUTO BV19 #define EX_NOFLEE BV20 #define EX_xSEARCHABLE BV21 #define EX_BASHED BV22 #define EX_BASHPROOF BV23 #define EX_NOMOB BV24 #define EX_WINDOW BV25 #define EX_xLOOK BV26 #define EX_ISBOLT BV27 #define EX_BOLTED BV28 #define MAX_EXFLAG 28 /* * Sector types. * Used in #ROOMS. */ typedef enum { SECT_INSIDE, SECT_CITY, SECT_FIELD, SECT_FOREST, SECT_HILLS, SECT_MOUNTAIN, SECT_WATER_SWIM, SECT_WATER_NOSWIM, SECT_UNDERWATER, SECT_AIR, SECT_DESERT, SECT_DUNNO, SECT_OCEANFLOOR, SECT_UNDERGROUND, SECT_LAVA, SECT_SWAMP, SECT_ICE, SECT_MAX } sector_types; /*************************************************************************** * * * VALUES OF INTEREST TO AREA BUILDERS * * (End of this section ... stop here) * * * ***************************************************************************/ /* * Positions. */ typedef enum { POS_DEAD, POS_MORTAL, POS_INCAP, POS_STUNNED, POS_SLEEPING, POS_BERSERK, POS_RESTING, POS_AGGRESSIVE, POS_SITTING, POS_FIGHTING, POS_DEFENSIVE, POS_EVASIVE, POS_STANDING, POS_MOUNTED, POS_SHOVE, POS_DRAG } positions; /* * Prototype for a mob. * This is the in-memory version of #MOBILES. */ struct mob_index_data { MOB_INDEX_DATA *next; MOB_INDEX_DATA *next_sort; SHOP_DATA *pShop; REPAIR_DATA *rShop; MPROG_DATA *mudprogs; EXT_BV progtypes; const char *player_name; const char *short_descr; const char *long_descr; const char *description; const char *spec_funname; int vnum; short count; short killed; short sex; short level; EXT_BV act; EXT_BV affected_by; short alignment; short mobthac0; /* Unused */ short ac; short hitnodice; short hitsizedice; short hitplus; short damnodice; short damsizedice; short damplus; short numattacks; int gold; int exp; int xflags; int immune; int resistant; int susceptible; EXT_BV attacks; EXT_BV defenses; int speaks; int speaking; short position; short defposition; short height; short weight; short race; short Class; short hitroll; short damroll; short perm_str; short perm_int; short perm_wis; short perm_dex; short perm_con; short perm_cha; short perm_lck; short saving_poison_death; short saving_wand; short saving_para_petri; short saving_breath; short saving_spell_staff; }; /* * Extra description data for a room or object. */ struct extra_descr_data { EXTRA_DESCR_DATA *next; /* Next in list */ EXTRA_DESCR_DATA *prev; /* Previous in list */ const char *keyword; /* Keyword in look/examine */ const char *description; /* What to see */ }; /* * Prototype for an object. */ struct obj_index_data { OBJ_INDEX_DATA *next; OBJ_INDEX_DATA *next_sort; EXTRA_DESCR_DATA *first_extradesc; EXTRA_DESCR_DATA *last_extradesc; AFFECT_DATA *first_affect; AFFECT_DATA *last_affect; MPROG_DATA *mudprogs; /* objprogs */ EXT_BV progtypes; /* objprogs */ EXT_BV extra_flags; const char *name; const char *short_descr; const char *description; const char *action_desc; int value[6]; int vnum; int serial; int cost; int rent; /* Unused */ int magic_flags; /*Need more bitvectors for spells - Scryn */ int wear_flags; short count; short weight; short layers; short level; short item_type; }; /* * Exit data. */ struct exit_data { EXIT_DATA *prev; /* previous exit in linked list */ EXIT_DATA *next; /* next exit in linked list */ EXIT_DATA *rexit; /* Reverse exit pointer */ ROOM_INDEX_DATA *to_room; /* Pointer to destination room */ const char *keyword; /* Keywords for exit or door */ const char *description; /* Description of exit */ int vnum; /* Vnum of room exit leads to */ int rvnum; /* Vnum of room in opposite dir */ int exit_info; /* door states & other flags */ int key; /* Key vnum */ short vdir; /* Physical "direction" */ short distance; /* how far to the next room */ 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; RESET_DATA *prev; RESET_DATA *first_reset; RESET_DATA *last_reset; RESET_DATA *next_reset; RESET_DATA *prev_reset; char command; int extra; int arg1; int arg2; int arg3; bool sreset; }; /* Constants for arg2 of 'B' resets. */ #define BIT_RESET_DOOR 0 #define BIT_RESET_OBJECT 1 #define BIT_RESET_MOBILE 2 #define BIT_RESET_ROOM 3 #define BIT_RESET_TYPE_MASK 0xFF /* 256 should be enough */ #define BIT_RESET_DOOR_THRESHOLD 8 #define BIT_RESET_DOOR_MASK 0xFF00 /* 256 should be enough */ #define BIT_RESET_SET BV30 #define BIT_RESET_TOGGLE BV31 #define BIT_RESET_FREEBITS 0x3FFF0000 /* For reference */ /* * Area definition. */ struct area_data { AREA_DATA *next; AREA_DATA *prev; AREA_DATA *next_sort; AREA_DATA *prev_sort; AREA_DATA *next_sort_name; /* Used for alphanum. sort */ AREA_DATA *prev_sort_name; /* Ditto, Fireblade */ ROOM_INDEX_DATA *first_room; ROOM_INDEX_DATA *last_room; const char *name; const char *filename; const char *author; /* Scryn */ const char *resetmsg; /* Rennard */ const char *credits; /* Edmond */ int flags; int low_r_vnum; int hi_r_vnum; int low_o_vnum; int hi_o_vnum; int low_m_vnum; int hi_m_vnum; int low_soft_range; int hi_soft_range; int low_hard_range; int hi_hard_range; int spelllimit; int curr_spell_count; int mkills; int mdeaths; int pkills; int pdeaths; int gold_looted; int illegal_pk; int high_economy; int low_economy; short status; /* h, 8/11 */ short age; short nplayer; short reset_frequency; short max_players; short version; short weatherx; /* Weather Cell Assignment for the X-Axis */ short weathery; /* Weather Cell Assignment for the Y-Axis */ }; /* * Room type. */ struct room_index_data { ROOM_INDEX_DATA *next; ROOM_INDEX_DATA *next_sort; RESET_DATA *first_reset; RESET_DATA *last_reset; RESET_DATA *last_mob_reset; RESET_DATA *last_obj_reset; ROOM_INDEX_DATA *next_aroom; /* Rooms within an area */ ROOM_INDEX_DATA *prev_aroom; EXTRA_DESCR_DATA *first_extradesc; /* extra descriptions */ EXTRA_DESCR_DATA *last_extradesc; /* .. */ AREA_DATA *area; EXIT_DATA *first_exit; /* exits from the room */ EXIT_DATA *last_exit; /* .. */ AFFECT_DATA *first_permaffect; /* Permanent affects on the room */ AFFECT_DATA *last_permaffect; AFFECT_DATA *first_affect; /* Temporary effects on the room */ AFFECT_DATA *last_affect; /* .. */ MPROG_ACT_LIST *mpact; /* mudprogs */ MPROG_DATA *mudprogs; /* mudprogs */ EXT_BV room_flags; EXT_BV progtypes; /* mudprogs */ const char *name; const char *description; int mpactnum; /* mudprogs */ int vnum; int tele_vnum; short light; /* amount of light in the room */ short sector_type; short winter_sector; short mpscriptpos; short tele_delay; short tunnel; /* max people that will fit */ }; typedef enum { SKILL_UNKNOWN, SKILL_SPELL, SKILL_SKILL, SKILL_WEAPON, SKILL_TONGUE, SKILL_HERB, SKILL_RACIAL, SKILL_DISEASE } 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 { const char *name; /* Name of skill */ const char *spell_fun_name; /* Spell function name - Trax */ const char *skill_fun_name; /* Skill function name - Trax */ short target; /* Legal targets */ short minimum_position; /* Position for caster / user */ short slot; /* Slot for #OBJECT loading */ short min_mana; /* Minimum mana used */ short beats; /* Rounds required to use skill */ const char *noun_damage; /* Damage message */ const char *msg_off; /* Wear off message */ short guild; /* Which guild the skill belongs to */ short min_level; /* Minimum level to be able to cast */ short type; /* Spell/Skill/Weapon/Tongue */ short range; /* Range of spell (rooms) */ int info; /* Spell action/class/etc */ int flags; /* Flags */ const char *hit_char; /* Success message to caster */ const char *hit_vict; /* Success message to victim */ const char *hit_room; /* Success message to room */ const char *hit_dest; /* Success message to dest room */ const char *miss_char; /* Failure message to caster */ const char *miss_vict; /* Failure message to victim */ const char *miss_room; /* Failure message to room */ const char *die_char; /* Victim death msg to caster */ const char *die_vict; /* Victim death msg to victim */ const char *die_room; /* Victim death msg to room */ const char *imm_char; /* Victim immune msg to caster */ const char *imm_vict; /* Victim immune msg to victim */ const char *imm_room; /* Victim immune msg to room */ const char *dice; /* Dice roll */ int value; /* Misc value */ int spell_sector; /* Sector Spell work */ char saves; /* What saving spell applies */ char difficulty; /* Difficulty of casting/learning */ SMAUG_AFF *first_affect; /* Spell affects, if any */ SMAUG_AFF *last_affect; const char *components; /* Spell components, if any */ const char *teachers; /* Skill requires a special teacher */ char participants; /* # of required participants */ struct timerset userec; /* Usage record */ }; /* used to do specific lookups */ // see db.c for documentation extern short num_skills; extern short num_sorted_skills; // Utility macros. int umin( int check, int ncheck ); int umax( int check, int ncheck ); int urange( int mincheck, int check, int 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 args( ( EXT_BV * bits ) ); void ext_clear_bits args( ( 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 xREMOVE_BIT(var, bit) ((var).bits[(bit) >> RSV] &= ~(1 << ((bit) & XBM))) #define xCLEAR_BITS(var) (ext_clear_bits(&(var))) #define xIS_EMPTY(var) (ext_is_empty(&(var))) /* * Memory allocation macros. */ #define CREATE(result, type, number) \ do \ { \ if (!((result) = (type *) calloc ((number), sizeof(type)))) \ { \ perror("malloc failure"); \ fprintf(stderr, "Malloc 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) #if defined(__FreeBSD__) #define DISPOSE(point) \ do \ { \ if( (point) ) \ { \ free( (void*) (point) ); \ (point) = NULL; \ } \ } while(0) #else #define DISPOSE(point) \ do \ { \ if( (point) ) \ { \ if( typeid((point)) == typeid(char*) || typeid((point)) == typeid(const char*) ) \ { \ if( in_hash_table( (char*)(point) ) ) \ { \ log_printf( "&RDISPOSE called on STRALLOC pointer: %s, line %d\n", __FILE__, __LINE__ ); \ log_string( "Attempting to correct." ); \ if( str_free( (char*)(point) ) == -1 ) \ log_printf( "&RSTRFREEing bad pointer: %s, line %d\n", __FILE__, __LINE__ ); \ } \ else \ free( (void*) (point) ); \ } \ else \ free( (void*) (point) ); \ (point) = NULL; \ } \ else \ (point) = NULL; \ } while(0) #endif #define STRALLOC(point) str_alloc((point)) #define QUICKLINK(point) quick_link((point)) #if defined(__FreeBSD__) #define STRFREE(point) \ do \ { \ if((point)) \ { \ if( str_free((point)) == -1 ) \ bug( "&RSTRFREEing bad pointer: %s, line %d", __FILE__, __LINE__ ); \ (point) = NULL; \ } \ } while(0) #else #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( (void*) (point) ); \ } \ else if( str_free((point)) == -1 ) \ log_printf( "&RSTRFREEing bad pointer: %s, line %d\n", __FILE__, __LINE__ ); \ (point) = NULL; \ } \ else \ (point) = NULL; \ } while(0) #endif /* 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 CHECK_SUBRESTRICTED(ch) \ do \ { \ if ( (ch)->substate == SUB_RESTRICTED ) \ { \ send_to_char( "You cannot use this command from within another command.\r\n", ch ); \ return; \ } \ } while(0) #define IS_VALID_SN(sn) ( (sn) >=0 && (sn) < MAX_SKILL \ && skill_table[(sn)] \ && skill_table[(sn)]->name ) #define SPELL_SAVE(skill) ( ((skill)->info >> 11) & 7 ) #define SET_SSAV(skill, val) ( (skill)->info = ((skill)->info & SSAV_MASK) + (((val) & 7) << 11) ) #define log_string(txt) ( log_string_plus( (txt), LOG_NORMAL, LEVEL_LOG ) ) /* * Global constants. */ extern FILE *fpArea; extern char strArea[MAX_INPUT_LENGTH]; extern const char *const dir_name[]; extern const short rev_dir[]; extern const char *const r_flags[]; extern const char *const w_flags[]; extern const char *const o_flags[]; extern const char *const a_flags[]; extern const char *const o_types[]; extern const char *const a_types[]; extern const char *const ris_flags[]; extern const char *const part_flags[]; extern const char *const defense_flags[]; extern const char *const attack_flags[]; extern const char *const npc_position[]; extern const char *const npc_sex[]; extern const char *const area_flags[]; extern const char *const ex_pmisc[]; extern const char *const ex_pwater[]; extern const char *const ex_pair[]; extern const char *const ex_pearth[]; extern const char *const ex_pfire[]; extern const char *const ex_flags[]; extern const char *const sec_flags[]; extern const char *const act_flags[]; extern SKILLTYPE *skill_table[MAX_SKILL]; extern const SKILLTYPE *skill_table_bytype[MAX_SKILL]; extern AREA_DATA *first_area; extern AREA_DATA *last_area; extern time_t current_time; extern struct act_prog_data *mob_act_list; #define SYSTEM_DIR "../system/" /* Main system files */ #define PROG_DIR "../mudprogs/" /* MUDProg files */ #define AREA_LIST "../area/area.lst" /* List of areas */ #define SHUTDOWN_FILE "shutdown.txt" /* For 'shutdown' */ #define BOOTLOG_FILE SYSTEM_DIR "boot.txt" /* Boot up error file */ #define SKILL_FILE SYSTEM_DIR "skills.dat" /* Skill table */ EXIT_DATA *get_exit args( ( ROOM_INDEX_DATA * room, short dir ) ); EXIT_DATA *get_exit_to args( ( ROOM_INDEX_DATA * room, short dir, int vnum ) ); const char *flag_string( int bitvector, const char *const flagarray[] ); const char *ext_flag_string( EXT_BV * bitvector, const char *const flagarray[] ); char *strip_cr( const char *str ); void fold_area( AREA_DATA * tarea, const char *filename ); int get_otype( const char *type ); int get_aflag( const char *flag ); int get_oflag( const char *flag ); int get_wflag( const char *flag ); int get_risflag( const char *flag ); int get_attackflag( const char *flag ); int get_defenseflag( const char *flag ); int get_exflag( const char *flag ); int get_rflag( const char *flag ); int get_secflag( const char *flag ); int get_actflag( const char *flag ); int get_npc_sex( const char *sex ); int get_areaflag( const char *flag ); int get_dir( const char *txt ); int get_partflag( const char *flag ); int get_npc_position( const char *position ); RESET_DATA *make_reset( char letter, int extra, int arg1, int arg2, int arg3 ); RESET_DATA *add_reset( ROOM_INDEX_DATA * room, char letter, int extra, int arg1, int arg2, int arg3 ); void reset_area( AREA_DATA * pArea ); char *str_dup( char const *str ); void boot_db( bool fCopyOver ); void area_update( void ); const char *get_extra_descr args( ( const char *name, EXTRA_DESCR_DATA * ed ) ); MOB_INDEX_DATA *get_mob_index args( ( int vnum ) ); OBJ_INDEX_DATA *get_obj_index args( ( int vnum ) ); ROOM_INDEX_DATA *get_room_index args( ( int vnum ) ); char fread_letter args( ( FILE * fp ) ); int fread_number args( ( FILE * fp ) ); EXT_BV fread_bitvector args( ( FILE * fp ) ); const char *fread_string args( ( FILE * fp ) ); const char *fread_flagstring( FILE * fp ); char *fread_string_nohash args( ( FILE * fp ) ); void fread_to_eol args( ( FILE * fp ) ); char *fread_word args( ( FILE * fp ) ); char *fread_line args( ( FILE * fp ) ); int number_range args( ( int from, int to ) ); int number_mm args( ( void ) ); void smash_tilde args( ( char *str ) ); bool str_cmp args( ( const char *astr, const char *bstr ) ); bool str_prefix args( ( const char *astr, const char *bstr ) ); void bug( const char *str, ... ) __attribute__ ( ( format( printf, 1, 2 ) ) ); void log_string_plus( const char *str, short log_type, short level ); void log_printf_plus( short log_type, short level, const char *fmt, ... ) __attribute__ ( ( format( printf, 3, 4 ) ) ); void log_printf( const char *fmt, ... ) __attribute__ ( ( format( printf, 1, 2 ) ) ); EXIT_DATA *make_exit args( ( ROOM_INDEX_DATA * pRoomIndex, ROOM_INDEX_DATA * to_room, short door ) ); void load_area_file( AREA_DATA * tarea, const char *filename ); size_t mudstrlcpy args( ( char *dst, const char *src, size_t siz ) ); size_t mudstrlcat args( ( char *dst, const char *src, size_t siz ) ); const char *mprog_type_to_name( int type ); bool is_name args( ( const char *str, const char *namelist ) ); void extract_exit args( ( ROOM_INDEX_DATA * room, EXIT_DATA * pexit ) ); const char *pull_type_name args( ( int pulltype ) ); const char *one_argument args( ( const char *argument, char *arg_first ) ); const char *one_argument2 args( ( const char *argument, char *arg_first ) ); int skill_lookup( const char *name ); int slot_lookup( int slot ); void load_skill_table( void ); void sort_skill_table( void ); void remap_slot_numbers( void ); const char *str_alloc( const char *str ); const char *quick_link( const char *str ); int str_free( const char *str ); bool in_hash_table( const char *str ); #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, RANDIW_PROG, SPEECHIW_PROG, PULL_PROG, PUSH_PROG, SLEEP_PROG, REST_PROG, LEAVE_PROG, SCRIPT_PROG, USE_PROG, SELL_PROG, TELL_PROG, CMD_PROG } prog_types; /* * For backwards compatability */ #define RDEATH_PROG DEATH_PROG #define ENTER_PROG ENTRY_PROG #define RFIGHT_PROG FIGHT_PROG #define RGREET_PROG GREET_PROG #define OGREET_PROG GREET_PROG