/* SillyMUD Distribution V1.1b (c) 1993 SillyMUD Developement See license.doc for distribution terms. SillyMUD is based on DIKUMUD */ #include <sys/types.h> #include <assert.h> typedef char sbyte; typedef unsigned char ubyte; typedef short int sh_int; typedef unsigned short int ush_int; typedef char bool; typedef char byte; /* my new stuff */ #define ALL_DARK 1 #define FOREST_DARK 2 #define NO_DARK 3 #define PULSE_COMMAND 0 #define PULSE_TICK 1 #define EVENT_DEATH 2 #define EVENT_SUMMER 3 #define EVENT_SPRING 4 #define EVENT_FALL 5 #define EVENT_WINTER 6 #define EVENT_GATHER 7 #define EVENT_ATTACK 8 #define EVENT_FOLLOW 9 #define EVENT_MONTH 10 #define EVENT_BIRTH 11 /* birth event for the mob. */ #define EVENT_FAMINE 12 #define EVENT_DWARVES_STRIKE 13 /* fitting number, eh? -DM */ #define EVENT_END_STRIKE 14 #define EVENT_END_FAMINE 15 #define EVENT_WEEK 16 #define EVENT_GOBLIN_RAID 17 #define EVENT_END_GOB_RAID 18 #define EVENT_DEATHROOM 19 #define DWARVES_STRIKE 1 #define FAMINE 2 #define SEASON_WINTER 1 #define SEASON_SPRING 2 #define SEASON_SUMMER 4 #define SEASON_FALL 8 typedef struct alias_type { char *com[10]; /* 10 aliases */ } Alias; #define MAX_CLASS 6 #define OLD_MAX_CLASS 4 #define MAX_STAT 6 /* s i, w, d, co (ch) */ /* the poofin and poofout shit. Dm gave this to Parallax, and the other gods are demanding it, so I'll install it :-) */ #define BIT_POOF_IN 1 #define BIT_POOF_OUT 2 /* Quest stuff */ struct QuestItem { int item; char *where; }; /* Race Choice Stuff */ struct RaceChoices { int race_num; char *what; }; #define RACE_LIST_SIZE 40 /* brewing stuff */ #define MAX_POTIONS 18 /* Make this equal the number you have in constants.c */ struct BrewMeister { char *keyword; int object[6]; }; #define VERSION "69.69b" /* tailoring stuff */ /* PLAYER_AUTH is defined in comm.h */ #define LIMITED_ITEMS 0 #define SITELOCK 0 #define NODUPLICATES 1 #define EGO 1 /* Mortal prompt things */ #define PROMPT_H 1 #define PROMPT_M 2 #define PROMPT_V 4 /* Immortal prompt things */ #define PROMPT_R 1 #define PROMPT_F 2 #define PROMPT_S 4 /* efficiency stuff */ #define MIN_GLOB_TRACK_LEV 31 /* mininum level for global track */ /* ** Site locking stuff.. written by Scot Gardner */ #define MAX_BAN_HOSTS 15 /* ** Newbie authorization stuff */ #define NEWBIE_REQUEST 1 #define NEWBIE_START 100 #define NEWBIE_AXE 0 #define NEWBIE_CHANCES 3 /* ** Limited item Stuff */ #define LIM_ITEM_COST_MIN 999 /* mininum rent cost of a lim. item */ /* ** distributed monster stuff */ #define TICK_WRAP_COUNT 3 /* PULSE_MOBILE / PULSE_TELEPORT */ /* Note: This stuff is all code dependent, Don't change it unless you know what you are doing. comm.c and mobact.c hold the stuff that you will HAVE to rewrite if you change either of those constants. */ #define PLR_TICK_WRAP 24 /* this should be a divisor of 24 (hours) */ /* ** multiclassing stuff */ #define MAGE_LEVEL_IND 0 #define CLERIC_LEVEL_IND 1 #define WARRIOR_LEVEL_IND 2 #define THIEF_LEVEL_IND 3 #define DRUID_LEVEL_IND 4 #define MONK_LEVEL_IND 5 #define FIRE_DAMAGE 1 #define COLD_DAMAGE 2 #define ELEC_DAMAGE 3 #define BLOW_DAMAGE 4 #define ACID_DAMAGE 5 #define HATE_SEX 1 #define HATE_RACE 2 #define HATE_CHAR 4 #define HATE_CLASS 8 #define HATE_EVIL 16 #define HATE_GOOD 32 #define HATE_VNUM 64 #define FEAR_SEX 1 #define FEAR_RACE 2 #define FEAR_CHAR 4 #define FEAR_CLASS 8 #define FEAR_EVIL 16 #define FEAR_GOOD 32 #define FEAR_VNUM 64 #define OP_SEX 1 #define OP_RACE 2 #define OP_CHAR 3 #define OP_CLASS 4 #define OP_EVIL 5 #define OP_GOOD 6 #define OP_VNUM 7 #define ABS_MAX_LVL 70 #define MAX_MORT 50 #define LOW_IMMORTAL 51 #define IMMORTAL 51 #define CREATOR 52 #define SAINT 53 #define DEMIGOD 54 #define LESSER_GOD 55 #define GOD 56 #define GREATER_GOD 57 #define SILLYLORD 58 #define IMPLEMENTOR 59 #define ADMIN 60 #define LOKI 61 #define MAX_IMMORT 61 #define IMM_FIRE 1 #define IMM_COLD 2 #define IMM_ELEC 4 #define IMM_ENERGY 8 #define IMM_BLUNT 16 #define IMM_PIERCE 32 #define IMM_SLASH 64 #define IMM_ACID 128 #define IMM_POISON 256 #define IMM_DRAIN 512 #define IMM_SLEEP 1024 #define IMM_CHARM 2048 #define IMM_HOLD 4096 #define IMM_NONMAG 8192 #define IMM_PLUS1 16384 #define IMM_PLUS2 32768 #define IMM_PLUS3 65536 #define IMM_PLUS4 131072 #define PULSE_RIVER 15 #define PULSE_TELEPORT 10 #define MAX_ROOMS 5000 struct nodes { int visited; int ancestor; }; struct room_q { int room_nr; struct room_q *next_q; }; struct string_block { int size; char *data; }; /* memory stuff */ struct char_list { struct char_data *op_ch; char name[50]; struct char_list *next; }; typedef struct { struct char_list *clist; int sex; /*number 1=male,2=female,3=both,4=neut,5=m&n,6=f&n,7=all*/ int race; /*number */ int class; /* 1=m,2=c,4=f,8=t */ int vnum; /* # */ int evil; /* align < evil = attack */ int good; /* align > good = attack */ } Opinion; /* old stuff. */ #define PULSE_ZONE 240 #define PULSE_MOBILE 30 #define PULSE_VIOLENCE 12 #define WAIT_SEC 4 #define WAIT_ROUND 4 /* We were getting purify hits on MAX_STRING_LENGTH */ #define MAX_STRING_LENGTH 20480 #define MAX_INPUT_LENGTH 160 #define MAX_MESSAGES 60 #define MAX_ITEMS 153 #define MESS_ATTACKER 1 #define MESS_VICTIM 2 #define MESS_ROOM 3 #define SECS_PER_REAL_MIN 60 #define SECS_PER_REAL_HOUR (60*SECS_PER_REAL_MIN) #define SECS_PER_REAL_DAY (24*SECS_PER_REAL_HOUR) #define SECS_PER_REAL_YEAR (365*SECS_PER_REAL_DAY) /* Lowered to 65 from 75 as a test */ #define SECS_PER_MUD_HOUR 65 #define SECS_PER_MUD_DAY (24*SECS_PER_MUD_HOUR) #define SECS_PER_MUD_MONTH (35*SECS_PER_MUD_DAY) #define SECS_PER_MUD_YEAR (17*SECS_PER_MUD_MONTH) /* The following defs are for obj_data */ /* For 'type_flag' */ #define ITEM_LIGHT 1 #define ITEM_SCROLL 2 #define ITEM_WAND 3 #define ITEM_STAFF 4 #define ITEM_WEAPON 5 #define ITEM_FIREWEAPON 6 #define ITEM_MISSILE 7 #define ITEM_TREASURE 8 #define ITEM_ARMOR 9 #define ITEM_POTION 10 #define ITEM_WORN 11 #define ITEM_OTHER 12 #define ITEM_TRASH 13 #define ITEM_TRAP 14 #define ITEM_CONTAINER 15 #define ITEM_NOTE 16 #define ITEM_DRINKCON 17 #define ITEM_KEY 18 #define ITEM_FOOD 19 #define ITEM_MONEY 20 #define ITEM_PEN 21 #define ITEM_BOAT 22 #define ITEM_AUDIO 23 #define ITEM_BOARD 24 #define ITEM_TREE 25 #define ITEM_ROCK 26 #define ITEM_WARPSTONE 27 /* Bitvector For 'wear_flags' */ #define ITEM_TAKE 1 #define ITEM_WEAR_FINGER 2 #define ITEM_WEAR_NECK 4 #define ITEM_WEAR_BODY 8 #define ITEM_WEAR_HEAD 16 #define ITEM_WEAR_LEGS 32 #define ITEM_WEAR_FEET 64 #define ITEM_WEAR_HANDS 128 #define ITEM_WEAR_ARMS 256 #define ITEM_WEAR_SHIELD 512 #define ITEM_WEAR_ABOUT 1024 #define ITEM_WEAR_WAISTE 2048 #define ITEM_WEAR_WRIST 4096 #define ITEM_WIELD 8192 #define ITEM_HOLD 16384 #define ITEM_THROW 32768 /* UNUSED, CHECKS ONLY FOR ITEM_LIGHT #define ITEM_LIGHT_SOURCE 65536 */ /* Bitvector for 'extra_flags' */ #define ITEM_GLOW 1 #define ITEM_HUM 2 #define ITEM_METAL 4 /* undefined... */ #define ITEM_MINERAL 8 /* undefined? */ #define ITEM_ORGANIC 16 /* undefined? */ #define ITEM_INVISIBLE 32 #define ITEM_MAGIC 64 #define ITEM_NODROP 128 #define ITEM_BLESS 256 #define ITEM_ANTI_GOOD 512 /* not usable by good people */ #define ITEM_ANTI_EVIL 1024 /* not usable by evil people */ #define ITEM_ANTI_NEUTRAL 2048 /* not usable by neutral people */ #define ITEM_ANTI_CLERIC 4096 #define ITEM_ANTI_MAGE 8192 #define ITEM_ANTI_THIEF 16384 #define ITEM_ANTI_FIGHTER 32768 #define ITEM_BRITTLE 65536 /* weapons that break after 1 hit */ /* armor that breaks when hit? */ #define ITEM_RESISTANT 131072 /* resistant to damage */ #define ITEM_ILLUSION 262144 /* Item is illusionary */ #define ITEM_ANTI_MEN 524288 /* men can't wield */ #define ITEM_ANTI_WOMEN 1048576 /* women can't wield */ #define ITEM_ANTI_SUN 2097152 /* item is sensitive to being in the sun */ #define ITEM_INSET 4194304 /* item has been inset w/another item */ #define ITEM_FIGURINE 8388608 /* Item is a figurine */ /* Some different kind of liquids */ #define LIQ_WATER 0 #define LIQ_BEER 1 #define LIQ_WINE 2 #define LIQ_ALE 3 #define LIQ_DARKALE 4 #define LIQ_WHISKY 5 #define LIQ_LEMONADE 6 #define LIQ_FIREBRT 7 #define LIQ_LOCALSPC 8 #define LIQ_SLIME 9 #define LIQ_MILK 10 #define LIQ_TEA 11 #define LIQ_COFFE 12 #define LIQ_BLOOD 13 #define LIQ_SALTWATER 14 #define LIQ_COKE 15 /* special addition for drinks */ #define DRINK_POISON (1<<0) #define DRINK_PERM (1<<1) /* for containers - value[1] */ #define CONT_CLOSEABLE 1 #define CONT_PICKPROOF 2 #define CONT_CLOSED 4 #define CONT_LOCKED 8 struct extra_descr_data { char *keyword; /* Keyword in look/examine */ char *description; /* What to see */ struct extra_descr_data *next; /* Next in list */ }; #define MAX_OBJ_AFFECT 5 /* Used in OBJ_FILE_ELEM *DO*NOT*CHANGE* */ #define OBJ_NOTIMER -7000000 struct obj_flag_data { int value[4]; /* Values of the item (see list) */ byte type_flag; /* Type of item */ int wear_flags; /* Where you can wear it */ long extra_flags; /* If it hums,glows etc */ int weight; /* Weigt what else */ int cost; /* Value when sold (gp.) */ int cost_per_day; /* Cost to keep pr. real day */ int timer; /* Timer for object */ long bitvector; /* To set chars bits */ }; /* Used in OBJ_FILE_ELEM *DO*NOT*CHANGE* */ struct obj_affected_type { short location; /* Which ability to change (APPLY_XXX) */ unsigned long modifier; /* How much it changes by */ }; /* ======================== Structure for object ========================*/ struct obj_data { sh_int item_number; /* Where in data-base */ int in_room; /* In what room -1 when conta/carr */ struct obj_flag_data obj_flags;/* Object information */ struct obj_affected_type affected[MAX_OBJ_AFFECT]; /* Which abilities in PC to change*/ sh_int sector; /* for large rooms */ sh_int char_vnum; /* for ressurection */ long char_f_pos; /* for ressurection */ char *name; /* Title of object :get etc. */ char *description ; /* When in room */ char *short_description; /* when worn/carry/in cont. */ char *action_description; /* What to write when used */ struct extra_descr_data *ex_description; /* extra descriptions */ struct char_data *carried_by; /* Carried by :NULL in room/conta */ byte eq_pos; /* what is the equip. pos? */ struct char_data *equipped_by; /* equipped by :NULL in room/conta*/ struct obj_data *in_obj; /* In what object NULL when none */ struct obj_data *contains; /* Contains objects */ struct obj_data *next_content; /* For 'contains' lists */ struct obj_data *next; /* For the object list */ struct char_data *link; /* Actual char linked for figurine*/ }; /* ======================================================================*/ /* The following defs are for room_data */ #define NOWHERE -1 /* nil reference for room-database */ #define AUTO_RENT -2 /* other special room, for auto-renting */ /* Bitvector For 'room_flags' */ #define DARK 1 #define DEATH 2 #define NO_MOB 4 #define INDOORS 8 #define PEACEFUL 16 /* No fighting */ #define NOSTEAL 32 /* No Thieving */ #define NO_SUM 64 /* no summoning */ #define NO_MAGIC 128 #define TUNNEL 256 /* Limited #s of people in room */ #define PRIVATE 512 #define SILENCE 1024 #define LARGE 2048 #define NO_DEATH 4096 #define SAVE_ROOM 8192 /* room will save eq and load at reboot */ /* For 'dir_option' */ #define NORTH 0 #define EAST 1 #define SOUTH 2 #define WEST 3 #define UP 4 #define DOWN 5 #define EX_ISDOOR 1 #define EX_CLOSED 2 #define EX_LOCKED 4 #define EX_SECRET 8 #define EX_RSLOCKED 16 #define EX_PICKPROOF 32 #define EX_CLIMB 64 /* For 'Sector types' */ #define SECT_INSIDE 0 #define SECT_CITY 1 #define SECT_FIELD 2 #define SECT_FOREST 3 #define SECT_HILLS 4 #define SECT_MOUNTAIN 5 #define SECT_WATER_SWIM 6 #define SECT_WATER_NOSWIM 7 #define SECT_AIR 8 #define SECT_UNDERWATER 9 #define SECT_DESERT 10 #define SECT_TREE 11 #define TELE_LOOK 1 #define TELE_COUNT 2 #define TELE_RANDOM 4 #define TELE_SPIN 8 #define LARGE_NONE 0 #define LARGE_WATER 1 #define LARGE_AIR 2 #define LARGE_IMPASS 4 struct large_room_data { unsigned int flags[9]; }; struct room_direction_data { char *general_description; /* When look DIR. */ char *keyword; /* for open/close */ sh_int exit_info; /* Exit info */ int key; /* Key's number (-1 for no key) */ int to_room; /* Where direction leeds (NOWHERE) */ }; /* ========================= Structure for room ========================== */ struct room_data { sh_int number; /* Rooms number */ sh_int zone; /* Room zone (for resetting) */ sh_int continent; /* Which continent/mega-zone */ int sector_type; /* sector type (move/hide) */ int river_dir; /* dir of flow on river */ int river_speed; /* speed of flow on river */ int tele_time; /* time to a teleport */ int tele_targ; /* target room of a teleport */ char tele_mask; /* flags for use with teleport */ int tele_cnt; /* countdown teleports */ unsigned char moblim; /* # of mobs allowed in room. */ char *name; /* Rooms name 'You are ...' */ char *description; /* Shown when entered */ struct extra_descr_data *ex_description; /* for examine/look */ struct room_direction_data *dir_option[6]; /* Directions */ long room_flags; /* DEATH,DARK ... etc */ byte light; /* Number of lightsources in room */ byte dark; int (*funct)(); /* special procedure */ struct obj_data *contents; /* List of items in room */ struct char_data *people; /* List of NPC / PC in room */ struct large_room_data *large; /* special for large rooms */ }; /* ======================================================================== */ /* The following defs and structures are related to char_data */ /* For 'equipment' */ #define WEAR_LIGHT 0 #define WEAR_FINGER_R 1 #define WEAR_FINGER_L 2 #define WEAR_NECK_1 3 #define WEAR_NECK_2 4 #define WEAR_BODY 5 #define WEAR_HEAD 6 #define WEAR_LEGS 7 #define WEAR_FEET 8 #define WEAR_HANDS 9 #define WEAR_ARMS 10 #define WEAR_SHIELD 11 #define WEAR_ABOUT 12 #define WEAR_WAISTE 13 #define WEAR_WRIST_R 14 #define WEAR_WRIST_L 15 #define WIELD 16 #define HOLD 17 /* For 'char_payer_data' */ /* ** #2 has been used!!!! Don't try using the last of the 3, because it is ** the keeper of active/inactive status for dead characters for ressurection! */ #define MAX_TOUNGE 3 /* Used in CHAR_FILE_U *DO*NOT*CHANGE* */ #define MAX_SKILLS 400 /* Used in CHAR_FILE_U *DO*NOT*CHANGE* */ #define MAX_WEAR 18 #define MAX_AFFECT 25 /* Used in CHAR_FILE_U *DO*NOT*CHANGE* */ /* Predifined conditions */ #define DRUNK 0 #define FULL 1 #define THIRST 2 /* Bitvector for 'affected_by' */ #define AFF_BLIND 0x00000001 #define AFF_INVISIBLE 0x00000002 #define AFF_DETECT_EVIL 0x00000004 #define AFF_DETECT_INVISIBLE 0x00000008 #define AFF_DETECT_MAGIC 0x00000010 #define AFF_SENSE_LIFE 0x00000020 #define AFF_LIFE_PROT 0x00000040 #define AFF_SANCTUARY 0x00000080 #define AFF_DRAGON_RIDE 0x00000100 #define AFF_GROWTH 0x00000200 /* this was the one that was missing*/ #define AFF_CURSE 0x00000400 #define AFF_FLYING 0x00000800 #define AFF_POISON 0x00001000 #define AFF_TREE_TRAVEL 0x00002000 #define AFF_PARALYSIS 0x00004000 #define AFF_INFRAVISION 0x00008000 #define AFF_WATERBREATH 0x00010000 #define AFF_SLEEP 0x00020000 #define AFF_TRAVELLING 0x00040000 /* i.e. can't be stoned */ #define AFF_SNEAK 0x00080000 #define AFF_HIDE 0x00100000 #define AFF_SILENCE 0x00200000 #define AFF_CHARM 0x00400000 #define AFF_FOLLOW 0x00800000 #define AFF_UNDEF_1 0x01000000 /* saved objects?? */ #define AFF_TRUE_SIGHT 0x02000000 #define AFF_SCRYING 0x04000000 /* seeing other rooms */ #define AFF_FIRESHIELD 0x08000000 #define AFF_GROUP 0x10000000 #define AFF_UNDEF_6 0x20000000 #define AFF_TEAM_GREY 0x40000000 #define AFF_TEAM_AMBER 0x80000000 /* affects 2 */ #define AFF2_ANIMAL_INVIS 0x00000001 /* the spell */ #define AFF2_HEAT_STUFF 0x00000002 /* the spell */ #define AFF2_LOG_ME 0x00000004 /* am I logged? */ #define AFF2_ONE_LIFER 0x00000008 /* am I stupid? */ #define AFF2_SUN_BLIND 0x00000010 /* do I not see well in daylight? */ #define AFF2_FEEDING 0x00000020 /* am I feeding (vampires) */ #define AFF2_BERSERK 0x00000040 /* ogres go ape! */ /* modifiers to char's abilities */ #define APPLY_NONE 0 #define APPLY_STR 1 #define APPLY_DEX 2 #define APPLY_INT 3 #define APPLY_WIS 4 #define APPLY_CON 5 #define APPLY_CHR 6 #define APPLY_SEX 7 #define APPLY_LEVEL 8 #define APPLY_AGE 9 #define APPLY_CHAR_WEIGHT 10 #define APPLY_CHAR_HEIGHT 11 #define APPLY_MANA 12 #define APPLY_HIT 13 #define APPLY_MOVE 14 #define APPLY_GOLD 15 #define APPLY_EXP 16 #define APPLY_AC 17 #define APPLY_ARMOR 17 #define APPLY_HITROLL 18 #define APPLY_DAMROLL 19 #define APPLY_SAVING_PARA 20 #define APPLY_SAVING_ROD 21 #define APPLY_SAVING_PETRI 22 #define APPLY_SAVING_BREATH 23 #define APPLY_SAVING_SPELL 24 #define APPLY_SAVE_ALL 25 #define APPLY_IMMUNE 26 #define APPLY_SUSC 27 #define APPLY_M_IMMUNE 28 #define APPLY_SPELL 29 #define APPLY_WEAPON_SPELL 30 #define APPLY_EAT_SPELL 31 #define APPLY_BACKSTAB 32 #define APPLY_KICK 33 #define APPLY_SNEAK 34 #define APPLY_HIDE 35 #define APPLY_BASH 36 #define APPLY_PICK 37 #define APPLY_STEAL 38 #define APPLY_TRACK 39 #define APPLY_HITNDAM 40 #define APPLY_SPELLFAIL 41 #define APPLY_ATTACKS 42 #define APPLY_HASTE 43 #define APPLY_SLOW 44 #define APPLY_BV2 45 #define APPLY_FIND_TRAPS 46 #define APPLY_RIDE 47 #define APPLY_RACE_SLAYER 48 #define APPLY_ALIGN_SLAYER 49 #define APPLY_MANA_REGEN 50 #define APPLY_HIT_REGEN 51 #define APPLY_MOVE_REGEN 52 #define APPLY_MOVE_BONUS 53 #define APPLY_INTRINSIC 54 /* This is somewhat of a hack, does nada */ /* just a marker that I check for in */ /* CastIntrinsic() in spell_parser.c -Rip */ /* 'class' for PC's */ #define CLASS_MAGIC_USER 1 #define CLASS_CLERIC 2 #define CLASS_WARRIOR 4 #define CLASS_THIEF 8 #define CLASS_DRUID 16 #define CLASS_MONK 32 #define CLASS_ALL 63 /* index values for classes having skills that require a minimum level */ /* attained to learn */ #define MIN_LEVEL_MAGIC 0 #define MIN_LEVEL_CLERIC 1 #define MIN_LEVEL_DRUID 2 #define MIN_LEVEL_NUM 3 /* number of such indexes required */ /* sex */ #define SEX_NEUTRAL 0 #define SEX_MALE 1 #define SEX_FEMALE 2 /* positions */ #define POSITION_DEAD 0 #define POSITION_MORTALLYW 1 #define POSITION_INCAP 2 #define POSITION_STUNNED 3 #define POSITION_SLEEPING 4 #define POSITION_RESTING 5 #define POSITION_SITTING 6 #define POSITION_FIGHTING 7 #define POSITION_STANDING 8 #define POSITION_MOUNTED 9 /* for mobile actions: specials.act */ #define ACT_SPEC (1<<0) /* special routine to be called if exist */ #define ACT_SENTINEL (1<<1) /* this mobile not to be moved */ #define ACT_SCAVENGER (1<<2) /* pick up stuff lying around */ #define ACT_ISNPC (1<<3) /* This bit is set for use with IS_NPC() */ #define ACT_NICE_THIEF (1<<4) /* Set if a thief should NOT be killed */ #define ACT_AGGRESSIVE (1<<5) /* Set if automatic attack on NPC's */ #define ACT_STAY_ZONE (1<<6) /* MOB Must stay inside its own zone */ #define ACT_WIMPY (1<<7) /* MOB Will flee when injured, and if */ /* aggressive only attack sleeping players */ #define ACT_ANNOYING (1<<8) /* MOB is so utterly irritating that other */ /* monsters will attack it... */ #define ACT_HATEFUL (1<<9) /* MOB will attack a PC or NPC matching a */ /* specified name */ #define ACT_AFRAID (1<<10) /* MOB is afraid of a certain PC or NPC, */ /* and will always run away .... */ #define ACT_IMMORTAL (1<<11) /* MOB is a natural event, can't be kiled */ #define ACT_HUNTING (1<<12) /* MOB is hunting someone */ #define ACT_DEADLY (1<<13) /* MOB has deadly poison */ #define ACT_POLYSELF (1<<14) /* MOB is a polymorphed person */ #define ACT_META_AGG (1<<15) /* MOB is _very_ aggressive */ #define ACT_GUARDIAN (1<<16) /* MOB will guard master */ #define ACT_ILLUSION (1<<17) /* MOB is illusionary */ #define ACT_HUGE (1<<18) /* MOB is too large to go indoors */ #define ACT_SCRIPT (1<<19) /* MOB has a script assigned to it DO NOT SET */ #define ACT_GREET (1<<20) /* MOB greets people */ #define ACT_FIGURINE (1<<21) /* MOB is a figurine */ #define ACT_BRIEF (1<<22) /* MOB is in brief mode (polys) */ #define ACT_SHOWEXITS (1<<23) /* MOB (poly) will see exits when looking */ /* For players : specials.act */ #define PLR_BRIEF (1<<0) #define PLR_COMPACT (1<<2) #define PLR_DONTSET (1<<3) /* Dont EVER set */ #define PLR_WIMPY (1<<4) /* character will flee when seriously injured */ #define PLR_NOHASSLE (1<<5) /* char won't be attacked by aggressives. */ #define PLR_STEALTH (1<<6) /* char won't be announced in a variety of situations */ #define PLR_HUNTING (1<<7) /* the player is hunting someone, do a track each look */ #define PLR_DEAF (1<<8) /* The player does not hear shouts */ #define PLR_ECHO (1<<9) /* Messages (tells, shout,etc) echo back */ #define PLR_SHOWEXITS (1<<10) /* show exits when looking at rooms */ #define PLR_NOSHOUT (1<<14)/* the player is not allowed to shout */ #define PLR_NOBEEP (1<<20)/* ignore all beeps */ /* This structure is purely intended to be an easy way to transfer */ /* and return information about time (real or mudwise). */ struct time_info_data { byte hours, day, month; sh_int year; }; /* Data used in the display code checks -DM */ struct last_checked { int mana; int mmana; int hit; int mhit; int move; int mmove; int exp; int gold; }; /* These data contain information about a players time data */ struct time_data { time_t birth; /* This represents the characters age */ time_t logon; /* Time of the last logon (used to calculate played) */ int played; /* This is the total accumulated time played in secs */ }; struct char_player_data { byte sex; /* PC / NPC s sex */ short weight; /* PC / NPC s weight */ short height; /* PC / NPC s height */ bool talks[MAX_TOUNGE]; /* PC s Tounges 0 for NPC */ char *name; /* PC / NPC s name (kill ... ) */ char *short_descr; /* for 'actions' */ char *long_descr; /* for 'look'.. Only here for testing */ char *description; /* Extra descriptions */ char *title; /* PC / NPC s title */ char *sounds; /* Sound that the monster makes (in room) */ char *distant_snds; /* Sound that the monster makes (other) */ long class; /* PC s class or NPC alignment */ int hometown; /* PC s Hometown (zone) */ long extra_flags; /* ressurection, etc */ struct time_data time; /* PC s AGE in days */ byte level[8]; /* PC / NPC s level */ }; /* Used in CHAR_FILE_U *DO*NOT*CHANGE* */ struct char_ability_data { sbyte str; sbyte str_add; /* 000 - 100 if strength 18 */ sbyte intel; sbyte wis; sbyte dex; sbyte con; sbyte chr; }; /* Used in CHAR_FILE_U *DO*NOT*CHANGE* */ struct char_point_data { sh_int mana; sh_int max_mana; byte mana_gain; sh_int hit; sh_int max_hit; /* Max hit for NPC */ byte hit_gain; sh_int move; sh_int max_move; /* Max move for NPC */ byte move_gain; sh_int armor; /* Internal -100..100, external -10..10 AC */ int gold; /* Money carried */ int bankgold; /* gold in the bank. */ int exp; /* The experience of the player */ sbyte hitroll; /* Any bonus or penalty to the hit roll */ sbyte damroll; /* Any bonus or penalty to the damage roll */ }; struct char_special_data { byte spellfail; /* max # for spell failure (101) */ byte tick; /* the tick that the mob/player is on */ byte pmask; /* poof mask */ byte position; /* Standing or ... */ byte default_pos; /* Default position for NPC */ byte spells_to_learn; /* How many can you learn yet this level*/ byte carry_items; /* Number of items carried */ byte damnodice; /* The number of damage dice's */ byte damsizedice; /* The size of the damage dice's */ byte last_direction; /* The last direction the monster went */ char sev; /* log severety level for gods */ byte move_cost; /* bonus or subtraction from movement cost */ int start_room; /* so people can be set to start certain places */ int edit; /* edit state */ sbyte conditions[3]; /* Drunk full etc. */ int prompt; /* And what kinda prompt will you be having? */ int permissions; /* What zone are they allowed to edit? */ int zone; /* zone that an NPC lives in */ int carry_weight; /* Carried weight */ int timer; /* Timer for update */ int was_in_room; /* storage of location for linkdead people */ int attack_type; /* The Attack Type Bitvector for NPC's */ int alignment; /* +-1000 for alignments */ int pct; /* For storing Wimpyness Percentage */ int flee; /* How many rooms do you want to run? */ int quest; /* which quest have we assigned this fool */ bool loot; /* Autoloot */ bool split; /* Autosplit */ bool bitten; /* vamp feeding on them? */ char *poofin; char *poofout; #if GROUP_NAMES char *gname; /* name of the group that the player is in. only the master of the group will have this set. The master can change the group names at will. There must be at least 2 pcs for something to be a group gwho? who group? to see what the groups are, and who are in them. (Pcs). */ #endif Alias *A_list; struct char_data *misc; struct char_data *fighting; /* Opponent */ struct char_data *hunting; /* Hunting person.. */ struct char_data *ridden_by; struct char_data *mounted_on; long affected_by; /* Bitvector for spells/skills affected by */ long affected_by2; /* Other special things */ long intrinsics; /* certain things have permanent */ /* unalienable abilities (infra etc) */ /* long intrinsics2; -> affected_by2 has no intrinsics in it, yet */ unsigned long act; /* flags for NPC behavior */ sh_int apply_saving_throw[5]; /* Saving throw (Bonuses) */ }; #define SKILL_KNOWN 1 /* Used in CHAR_FILE_U *DO*NOT*CHANGE* */ struct char_skill_data { byte learned; /* % chance for success 0 = not learned */ byte flags; }; /* Used in CHAR_FILE_U *DO*NOT*CHANGE* */ struct affected_type { short type; /* The type of spell that caused this */ sh_int duration; /* For how long its effects will last */ sbyte modifier; /* This is added to apropriate ability */ byte location; /* Tells which ability to change(APPLY_XXX)*/ long bitvector; /* Tells which bits to set (AFF_XXX) */ struct affected_type *next; }; struct follow_type { struct char_data *follower; struct follow_type *next; }; /* ================== Structure for player/non-player ===================== */ struct char_data { sh_int nr; /* monster nr (pos in file) */ int in_room; /* Location */ int term; int size; struct last_checked last; /* For displays */ unsigned immune; /* Immunities */ unsigned M_immune; /* Meta Immunities */ unsigned susc; /* susceptibilities */ float mult_att; /* the number of attacks */ byte attackers; byte sector; /* which part of a large room am i in? */ int generic; /* generic int */ int commandp; /* command poitner for scripts */ int waitp; /* waitp for scripts */ int commandp2; /* place-holder for gosubs, etc. */ int script; sh_int race; sh_int hunt_dist; /* max dist the player can hunt */ unsigned short hatefield; unsigned short fearfield; Opinion hates; Opinion fears; sh_int persist; int old_room; void *act_ptr; /* numeric argument for the mobile actions */ struct char_player_data player; /* Normal data */ struct char_ability_data abilities; /* Abilities */ struct char_ability_data tmpabilities;/* The abilities we use */ struct char_point_data points; /* Points */ struct char_special_data specials; /* Special plaing constant */ struct char_skill_data *skills; /* Skills */ struct affected_type *affected; /* affected by what spells */ struct obj_data *equipment[MAX_WEAR]; /* Equipment array */ struct obj_data *carrying; /* Head of list */ struct descriptor_data *desc; /* NULL for mobiles */ struct char_data *orig; /* Special for polymorph */ struct char_data *next_in_room; /* For room->people - list */ struct char_data *next; /* all in game list */ struct char_data *next_fighting; /* For fighting list */ struct follow_type *followers; /* List of chars followers */ struct char_data *master; /* Who is char following? */ int invis_level; /* visibility of gods */ struct obj_data *link; /* Link for figurines */ }; /* ======================================================================== */ /* How much light is in the land ? */ #define SUN_DARK 0 #define SUN_RISE 1 #define SUN_LIGHT 2 #define SUN_SET 3 #define MOON_SET 4 #define MOON_RISE 5 /* moon changes -DM 7/16/92 */ /* And how is the sky ? */ #define SKY_CLOUDLESS 0 #define SKY_CLOUDY 1 #define SKY_RAINING 2 #define SKY_LIGHTNING 3 struct weather_data { int pressure; /* How is the pressure ( Mb ) */ int change; /* How fast and what way does it change. */ int sky; /* How is the sky. */ int sunlight; /* And how much sun. */ }; /* *********************************************************************** * file element for player file. BEWARE: Changing it will ruin the file * *********************************************************************** */ struct char_file_u { byte sex; byte class; byte level[8]; time_t birth; /* Time of birth of character */ int played; /* Number of secs played in total */ int race; ubyte weight; ubyte height; char title[80]; sh_int hometown; char description[240]; bool talks[MAX_TOUNGE]; long extra_flags; sh_int load_room; /* Which room to place char in */ struct char_ability_data abilities; struct char_point_data points; struct char_skill_data skills[MAX_SKILLS]; struct affected_type affected[MAX_AFFECT]; /* specials */ byte spells_to_learn; int alignment; long affected_by; long affected_by2; time_t last_logon; /* Time (in secs) of last logon */ long act; /* ACT Flags */ /* char data */ char name[20]; char pwd[11]; sh_int apply_saving_throw[5]; int conditions[3]; int startroom; /* which room the player should start in */ }; /* *********************************************************************** * file element for object file. BEWARE: Changing it will ruin the file * *********************************************************************** */ struct obj_cost { /* used in act.other.c:do_save as well as in reception2.c */ int total_cost; int no_carried; bool ok; }; #define MAX_OBJ_SAVE 200 /* Used in OBJ_FILE_U *DO*NOT*CHANGE* */ struct equip_fill { sh_int finger[3]; int fingerego; sh_int neck[3]; int neckego; sh_int body[2]; int bodyego; sh_int head[2]; int headego; sh_int legs[2]; int legsego; sh_int feet[2]; int feetego; sh_int arms[2]; int armsego; sh_int hands[2]; int handsego; sh_int shield[2]; int shieldego; sh_int about[2]; int aboutego; sh_int waist[2]; int waistego; sh_int wrist[3]; int wristego; sh_int wield[2]; int wieldego; sh_int misfit[MAX_OBJ_SAVE]; int misfitego[MAX_OBJ_SAVE]; }; struct obj_file_elem { sh_int item_number; int value[4]; int extra_flags; int weight; int timer; long bitvector; char name[128]; /* big, but not horrendously so */ char sd[128]; char desc[256]; struct obj_affected_type affected[MAX_OBJ_AFFECT]; }; struct obj_file_u { char owner[20]; /* Name of player */ int gold_left; /* Number of goldcoins left at owner */ int total_cost; /* The cost for all items, per day */ long last_update; /* Time in seconds, when last updated */ long minimum_stay; /* For stasis */ int number; /* number of objects */ struct obj_file_elem objects[MAX_OBJ_SAVE]; }; #if 0 #define MAX_OBJ_SAVE 200 /* Used in OBJ_FILE_U *DO*NOT*CHANGE* */ struct rental_header { char inuse; int length; char owner[20]; /* Name of player */ }; struct obj_file_elem { sh_int item_number; int value[4]; int extra_flags; int weight; int timer; long bitvector; struct obj_affected_type affected[MAX_OBJ_AFFECT]; }; struct obj_file_u { int gold_left; /* Number of goldcoins left at owner */ int total_cost; /* The cost for all items, per day */ long last_update; /* Time in seconds, when last updated */ long minimum_stay; /* For stasis */ int nobjects; /* how many objects below */ struct obj_file_elem objects[MAX_OBJ_SAVE]; /* We don't always allocate this much space but it is handy for the times when you need a fast one lying around. */ }; #endif /* *********************************************************** * The following structures are related to descriptor_data * *********************************************************** */ struct txt_block { char *text; struct txt_block *next; }; struct txt_q { struct txt_block *head; struct txt_block *tail; }; /* modes of connectedness */ #define CON_PLYNG 0 #define CON_NME 1 #define CON_NMECNF 2 #define CON_PWDNRM 3 #define CON_PWDGET 4 #define CON_PWDCNF 5 #define CON_QSEX 6 #define CON_RMOTD 7 #define CON_SLCT 8 #define CON_EXDSCR 9 #define CON_QCLASS 10 #define CON_LDEAD 11 #define CON_PWDNEW 12 #define CON_PWDNCNF 13 #define CON_WIZLOCK 14 #define CON_QRACE 15 #define CON_RACPAR 16 #define CON_AUTH 17 #define CON_CITY_CHOICE 18 #define CON_STAT_LIST 19 #define CON_QDELETE 20 #define CON_QDELETE2 21 #define CON_STAT_LISTV 22 #define CON_WMOTD 23 #define CON_EDITING 24 #define CON_LEVEL_LIM 25 #define CON_ALIGN 26 struct snoop_data { struct char_data *snooping; /* Who is this char snooping */ struct char_data *snoop_by; /* And who is snooping on this char */ }; struct descriptor_data { int descriptor; /* file descriptor for socket */ char host[50]; /* hostname */ char pwd[12]; /* password */ int pos; /* position in player-file */ int connected; /* mode of 'connectedness' */ int wait; /* wait for how many loops */ char *showstr_head; /* for paging through texts */ char *showstr_point; /* - */ char **str; /* for the modify-str system */ int max_str; /* - */ int prompt_mode; /* control of prompt-printing */ char buf[MAX_STRING_LENGTH]; /* buffer for raw input */ char last_input[MAX_INPUT_LENGTH];/* the last input */ char stat[MAX_STAT]; /* stat priorities */ struct txt_q output; /* q of strings to send */ struct txt_q input; /* q of unprocessed input */ struct char_data *character; /* linked to char */ struct char_data *original; /* original char */ struct snoop_data snoop; /* to snoop people. */ struct descriptor_data *next; /* link to next descriptor */ }; struct msg_type { char *attacker_msg; /* message to attacker */ char *victim_msg; /* message to victim */ char *room_msg; /* message to room */ }; struct message_type { struct msg_type die_msg; /* messages when death */ struct msg_type miss_msg; /* messages when miss */ struct msg_type hit_msg; /* messages when hit */ struct msg_type sanctuary_msg;/* messages when hit on sanctuary */ struct msg_type god_msg; /* messages when hit on god */ struct message_type *next;/* to next messages of this kind.*/ }; struct message_list { int a_type; /* Attack type */ int number_of_attacks; /* How many attack messages to chose from. */ struct message_type *msg; /* List of messages. */ }; struct dex_skill_type { sh_int p_pocket; sh_int p_locks; sh_int traps; sh_int sneak; sh_int hide; }; struct dex_app_type { sh_int reaction; sh_int miss_att; sh_int defensive; }; struct str_app_type { sh_int tohit; /* To Hit (THAC0) Bonus/Penalty */ sh_int todam; /* Damage Bonus/Penalty */ sh_int carry_w; /* Maximum weight that can be carrried */ sh_int wield_w; /* Maximum weight that can be wielded */ }; struct wis_app_type { byte bonus; /* how many bonus skills a player can */ /* practice pr. level */ }; struct int_app_type { byte learn; /* how many % a player learns a spell/skill */ }; struct con_app_type { sh_int hitp; sh_int shock; }; struct chr_app_type { sh_int num_fol; sh_int reaction; }; /************************************************************/ typedef void (*funcp)(); struct breather { int vnum; int cost; funcp *breaths; }; struct figurine_data { int mob; int obj; }; #define MAX_RACE_DENY 3 #define MAX_RACE_INTRINSIC 3 struct skill_data { void (*spell_pointer) (byte level, struct char_data *ch, char *arg, int type, struct char_data *tar_ch, struct obj_data *tar_obj); byte minimum_position; /* Position for usage */ ubyte min_usesmana; /* Amount of mana used by a spell */ byte beats; /* Heartbeats until ready for next */ byte min_level[MIN_LEVEL_NUM];/* minimum usage level (spells) */ sh_int targets; /* See below for use with TAR_XXX */ sh_int spellfail; /* modifier for spell failure */ int taught_by; /* #defined beneath */ int class_use; /* what classes can use it */ int percent; /* added by Kiku */ ubyte race_deny[MAX_RACE_DENY]; /* races that can't use this skill */ /* races having this skill intrinsically */ ubyte race_intrinsic[MAX_RACE_INTRINSIC]; }; #define TAUGHT_BY_MAGE 1 #define TAUGHT_BY_CLERIC 2 #define TAUGHT_BY_THIEF 4 #define TAUGHT_BY_WARRIOR 8 #define TAUGHT_BY_DRUID 16 #define TAUGHT_BY_MONK 32 #define TAUGHT_BY_NINJA 64 #define TAUGHT_BY_SAILOR 128 #define TAUGHT_BY_LORE 256 #define TAUGHT_BY_HUNTER 512 #define TAUGHT_BY_ETTIN 1024 /* beserk */