/************************************************************************** * # # # ## # # ### ## ## ### http://www.lyonesse.it * * # # # # # ## # # # # # * * # # # # # ## ## # # ## ## ## # # ## * * # # # # # ## # # # # # # # # # # # * * ### # ## # # ### ## ## ### # # #### ## Ver. 1.0 * * * * -Based on CircleMud & Smaug- Copyright (c) 2001-2002 by Mithrandir * * * * ********************************************************************** */ /* ************************************************************************ * File: structs.h Part of CircleMUD * * Usage: header file for central structures and contstants * * * * All rights reserved. See license.doc for complete information. * * * * Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University * * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * ************************************************************************ */ /* * Intended use of this macro is to allow external packages to work with * a variety of CircleMUD versions without modifications. For instance, * an IS_CORPSE() macro was introduced in pl13. Any future code add-ons * could take into account the CircleMUD version and supply their own * definition for the macro if used on an older version of CircleMUD. * You are supposed to compare this with the macro CIRCLEMUD_VERSION() * in utils.h. See there for usage. */ #define _CIRCLEMUD 0x030015 /* Major/Minor/Patchlevel - MMmmPP */ /* preamble *************************************************************/ /* * Eventually we want to be able to redefine the below to any arbitrary * value. This will allow us to use unsigned data types to get more * room and also remove the '< 0' checks all over that implicitly * assume these values. -gg 12/17/99 */ #define NOWHERE -1 /* nil reference for rooms */ #define NOTHING -1 /* nil reference for objects */ #define NOBODY -1 /* nil reference for mobiles */ #define SPECIAL(name) \ int (name)(CHAR_DATA *ch, void *me, int cmd, char *argument) #define EVENTFUNC(name) \ long (name)(void *event_obj) #define C_FUNC(name) \ void (name) (DESCRIPTOR_DATA *d, char *arg, void *info) /* room-related defines *************************************************/ #define ROOM_HASH 1021 /* The cardinal directions: used as index to room_data.dir_option[] */ #define NORTH 0 #define EAST 1 #define SOUTH 2 #define WEST 3 #define UP 4 #define DOWN 5 #define NORTHEAST 6 #define SOUTHEAST 7 #define SOUTHWEST 8 #define NORTHWEST 9 /* Room flags: used in room_data.room_flags */ /* WARNING: In the world files, NEVER set the bits marked "R" ("Reserved") */ #define ROOM_DARK (1 << 0) /* a Dark */ #define ROOM_DEATH (1 << 1) /* b Death trap */ #define ROOM_NOMOB (1 << 2) /* c MOBs not allowed */ #define ROOM_INDOORS (1 << 3) /* d Indoors */ #define ROOM_PEACEFUL (1 << 4) /* e Violence not allowed */ #define ROOM_SOUNDPROOF (1 << 5) /* f Shouts, gossip blocked */ #define ROOM_NOTRACK (1 << 6) /* g Track won't go through */ #define ROOM_NOMAGIC (1 << 7) /* h Magic not allowed */ #define ROOM_TUNNEL (1 << 8) /* i room for only 1 pers */ #define ROOM_PRIVATE (1 << 9) /* j Can't teleport in */ #define ROOM_GODROOM (1 << 10) /* k LVL_GOD+ only allowed */ #define ROOM_HOUSE (1 << 11) /* l (R) Room is a house */ #define ROOM_HOUSE_CRASH (1 << 12) /* m (R) House needs saving */ #define ROOM_ATRIUM (1 << 13) /* n (R) The door to a house */ #define ROOM_OLC (1 << 14) /* o (R) Modifyable/!compress */ #define ROOM_BFS_MARK (1 << 15) /* p (R) breath-first srch mrk */ #define ROOM_WILD_STATIC (1 << 16) /* q (R) static wilderness room */ #define ROOM_WILD_REMOVE (1 << 17) /* r (R) wild room to be deleted */ #define ROOM_SAVEROOM (1 << 18) /* s room is a loadroom */ #define ROOM_BUILDING_WORKS (1 << 19) /* t (R) building works in progress... */ /* Room affections: used in room_data.room_affs */ #define RAFF_FOG (1 << 0) /* a Wall of Fog */ #define RAFF_SHIELD (1 << 1) /* b Room Shield */ #define RAFF_CAMP (1 << 2) /* c Campsite */ /* Exit info: used in room_data.dir_option.exit_info */ #define EX_ISDOOR (1 << 0) /* a Exit is a door */ #define EX_CLOSED (1 << 1) /* b The door is closed */ #define EX_LOCKED (1 << 2) /* c The door is locked */ #define EX_PICKPROOF (1 << 3) /* d Lock can't be picked */ #define EX_FALSE (1 << 4) /* e Exit is a NOWHERE leading exit */ #define EX_HIDDEN (1 << 5) /* f Exit is hidden */ /* Sector types: used in room_data.sector_type */ #define SECT_INSIDE 0 /* Indoors (no map) */ #define SECT_CITY 1 /* " */ /* In a city */ #define SECT_FIELD 2 /* v */ /* In a field */ #define SECT_FOREST 3 /* f */ /* In a forest */ #define SECT_HILLS 4 /* c */ /* In the hills */ #define SECT_MOUNTAIN 5 /* m */ /* On a mountain */ #define SECT_WATER_SWIM 6 /* Swimmable water (no map) */ #define SECT_WATER_NOSWIM 7 /* ~ */ /* Water - need a boat */ #define SECT_UNDERWATER 8 /* Underwater (no map) */ #define SECT_FLYING 9 /* Wheee! (no map) */ #define SECT_LAND 10 /* b */ /* terra brulla */ #define SECT_JUNGLE 11 /* F */ /* foresta fitta */ #define SECT_FORESTED_HILL 12 /* C */ /* collina boscosa */ #define SECT_MOUNTAIN_PEAK 13 /* M */ /* montagna alta */ #define SECT_PLATEAU 14 /* A */ /* altopiano */ #define SECT_PLAIN 15 /* p */ /* pianura */ #define SECT_REEF 16 /* Z */ /* scogliera */ #define SECT_SWAMP 17 /* d */ /* palude */ #define SECT_RIVER 18 /* a */ /* fiumi e laghi */ #define SECT_SEA 19 /* ~ */ /* mari e oceani */ #define SECT_BEACH 20 /* s */ /* spiaggia */ #define SECT_ARTIC 21 /* G */ /* tundra artica */ #define SECT_ROAD 22 /* : */ /* strade e viottoli */ #define SECT_BRIDGE 23 /* = */ /* ponti */ #define SECT_COAST 24 /* . */ /* costa */ #define SECT_WILD_EXIT 25 /* @ */ /* exit from wilderness */ #define SECT_ZONE_BORDER 26 /* I */ /* border for a zone */ #define SECT_ZONE_INSIDE 27 /* */ /* inside a zone */ #define SECT_PORT 28 /* H */ /* porto */ #define SECT_RIVER_NAVIGABLE 29 /* k */ /* fiume percorribile con navi */ #define SECT_FORESTED_MOUNTAIN 30 /* T */ /* montagna boscosa */ #define SECT_SHIP_STERN 31 /* ship stern (no map) */ #define SECT_SHIP_DECK 32 /* ship deck (no map) */ #define SECT_SHIP_BOW 33 /* ship bow (no map) */ #define SECT_SHIP_UNDERDK 34 /* ship underdeck (no map) */ #define SECT_SHIP_CABIN 35 /* ship cabin (no map) */ #define SECT_SHIP_HOLD 36 /* ship hold (no map) */ #define SECT_FERRY_DECK 37 /* ferryboat room (no map) */ #define SECT_FORD 38 /* u */ /* guado */ #define SECT_DESERT 39 /* D */ /* deserto */ #define SECT_SHALLOWS 40 /* - */ /* shallows */ #define MAX_SECT 41 /* char and mob-related defines *****************************************/ /* PC classes */ #define CLASS_UNDEFINED -1 #define CLASS_MAGIC_USER 0 #define CLASS_CLERIC 1 #define CLASS_THIEF 2 #define CLASS_WARRIOR 3 #define CLASS_SORCERER 4 #define NUM_CLASSES 5 /* This must be the number of classes!! */ /* NPC classes (currently unused - feel free to implement!) */ #define CLASS_OTHER 0 #define CLASS_UNDEAD 1 #define CLASS_HUMANOID 2 #define CLASS_ANIMAL 3 #define CLASS_DRAGON 4 #define CLASS_GIANT 5 /* Races */ #define RACE_UNDEFINED -1 #define RACE_HUMAN 0 #define RACE_ELF 1 #define RACE_DWARF 2 /* Remort code */ #define MULTI_ROOM NOWHERE #define MULTI_LEVEL (LVL_IMMORT - 1) /* Stats char should start at after multi */ #define MULTI_HP 20 #define MULTI_MANA 50 #define MULTI_MOVE 100 /* Sex */ #define SEX_NEUTRAL 0 #define SEX_MALE 1 #define SEX_FEMALE 2 /* Positions */ #define POS_DEAD 0 /* dead */ #define POS_MORTALLYW 1 /* mortally wounded */ #define POS_INCAP 2 /* incapacitated */ #define POS_STUNNED 3 /* stunned */ #define POS_SLEEPING 4 /* sleeping */ #define POS_RESTING 5 /* resting */ #define POS_SITTING 6 /* sitting */ #define POS_FIGHTING 7 /* fighting */ #define POS_STANDING 8 /* standing */ /* Player flags: used by char_data.char_player_data.act */ #define PLR_KILLER (1 << 0) /* a Player is a player-killer */ #define PLR_THIEF (1 << 1) /* b Player is a player-thief */ #define PLR_FROZEN (1 << 2) /* c Player is frozen */ #define PLR_DONTSET (1 << 3) /* d Don't EVER set (ISNPC bit) */ #define PLR_WRITING (1 << 4) /* e Player writing (board/mail/olc) */ #define PLR_MAILING (1 << 5) /* f Player is writing mail */ #define PLR_CRASH (1 << 6) /* g Player needs to be crash-saved */ #define PLR_SITEOK (1 << 7) /* h Player has been site-cleared */ #define PLR_NOSHOUT (1 << 8) /* i Player not allowed to shout/goss */ #define PLR_NOTITLE (1 << 9) /* j Player not allowed to set title */ #define PLR_DELETED (1 << 10) /* k Player deleted - space reusable */ #define PLR_LOADROOM (1 << 11) /* l Player uses nonstandard loadroom */ #define PLR_NOWIZLIST (1 << 12) /* m Player shouldn't be on wizlist */ #define PLR_NODELETE (1 << 13) /* n Player shouldn't be deleted */ #define PLR_INVSTART (1 << 14) /* o Player should enter game wizinvis */ #define PLR_CRYO (1 << 15) /* p Player is cryo-saved (purge prog) */ #define PLR_NOTDEADYET (1 << 16) /* q (R) Player being extracted. */ #define PLR_GHOST (1 << 17) /* r (R) Player is a ghost (after dead) */ #define PLR_CAMPED (1 << 18) /* s (R) must save mounts and vehicles too*/ /* Mobile flags: used by char_data.char_player_data.act */ #define MOB_SPEC (1 << 0) /* a Mob has a callable spec-proc */ #define MOB_SENTINEL (1 << 1) /* b Mob should not move */ #define MOB_SCAVENGER (1 << 2) /* c Mob picks up stuff on the ground */ #define MOB_ISNPC (1 << 3) /* d (R) Automatically set on all Mobs */ #define MOB_AWARE (1 << 4) /* e Mob can't be backstabbed */ #define MOB_AGGRESSIVE (1 << 5) /* f Mob auto-attacks everybody nearby */ #define MOB_STAY_ZONE (1 << 6) /* g Mob shouldn't wander out of zone */ #define MOB_WIMPY (1 << 7) /* h Mob flees if severely injured */ #define MOB_AGGR_EVIL (1 << 8) /* i Auto-attack any evil PC's */ #define MOB_AGGR_GOOD (1 << 9) /* j Auto-attack any good PC's */ #define MOB_AGGR_NEUTRAL (1 << 10) /* k Auto-attack any neutral PC's */ #define MOB_MEMORY (1 << 11) /* l remember attackers if attacked */ #define MOB_HELPER (1 << 12) /* m attack PCs fighting other NPCs */ #define MOB_NOCHARM (1 << 13) /* n Mob can't be charmed */ #define MOB_NOSUMMON (1 << 14) /* o Mob can't be summoned */ #define MOB_NOSLEEP (1 << 15) /* p Mob can't be slept */ #define MOB_NOBASH (1 << 16) /* q Mob can't be bashed (e.g. trees) */ #define MOB_NOBLIND (1 << 17) /* r Mob can't be blinded */ #define MOB_NOTDEADYET (1 << 18) /* s (R) Mob being extracted. */ #define MOB_MOUNTABLE (1 << 19) /* t Mob can be used as mount */ #define MOB_HUNTER (1 << 20) /* u Mob can track down characters */ #define MOB_DRAFT_ANIMAL (1 << 21) /* v mob can be yoked to vehicles */ #define MOB_ENCOUNTER (1 << 22) /* z (R) Mob is an encounter mob (take care) */ /* Preference flags: used by char_data.player_specials.pref */ #define PRF_BRIEF (1 << 0) /* a Room descs won't normally be shown */ #define PRF_COMPACT (1 << 1) /* b No extra CRLF pair before prompts */ #define PRF_DEAF (1 << 2) /* c Can't hear shouts */ #define PRF_NOTELL (1 << 3) /* d Can't receive tells */ #define PRF_DISPHP (1 << 4) /* e Display hit points in prompt */ #define PRF_DISPMANA (1 << 5) /* f Display mana points in prompt */ #define PRF_DISPMOVE (1 << 6) /* g Display move points in prompt */ #define PRF_AUTOEXIT (1 << 7) /* h Display exits in a room */ #define PRF_NOHASSLE (1 << 8) /* i Aggr mobs won't attack */ #define PRF_QUEST (1 << 9) /* j On quest */ #define PRF_SUMMONABLE (1 << 10) /* k Can be summoned */ #define PRF_NOREPEAT (1 << 11) /* l No repetition of comm commands */ #define PRF_HOLYLIGHT (1 << 12) /* m Can see in dark */ #define PRF_COLOR_1 (1 << 13) /* n Color (low bit) */ #define PRF_COLOR_2 (1 << 14) /* o Color (high bit) */ #define PRF_NOWIZ (1 << 15) /* p Can't hear wizline */ #define PRF_LOG1 (1 << 16) /* q On-line System Log (low bit) */ #define PRF_LOG2 (1 << 17) /* r On-line System Log (high bit) */ #define PRF_NOAUCT (1 << 18) /* s Can't hear auction channel */ #define PRF_NOGOSS (1 << 19) /* t Can't hear gossip channel */ #define PRF_NOGRATZ (1 << 20) /* u Can't hear grats channel */ #define PRF_ROOMFLAGS (1 << 21) /* v Can see room flags (ROOM_x) */ #define PRF_WILDTEXT (1 << 22) /* w see wild with word instead of graph*/ #define PRF_WILDBLACK (1 << 23) /* x see wild symbols in b/w */ #define PRF_WILDSMALL (1 << 24) /* y see wild reduced to the max */ #define PRF_NOGREET (1 << 25) /* z Doesn't want to be greeted by others */ /* Affect bits: used in char_data.char_player_data.affected_by */ /* WARNING: In the world files, NEVER set the bits marked "R" ("Reserved") */ #define AFF_BLIND (1 << 0) /* a (R) Char is blind */ #define AFF_INVISIBLE (1 << 1) /* b Char is invisible */ #define AFF_DETECT_ALIGN (1 << 2) /* c Char is sensitive to align */ #define AFF_DETECT_INVIS (1 << 3) /* d Char can see invis chars */ #define AFF_DETECT_MAGIC (1 << 4) /* e Char is sensitive to magic */ #define AFF_SENSE_LIFE (1 << 5) /* f Char can sense hidden life */ #define AFF_WATERWALK (1 << 6) /* g Char can walk on water */ #define AFF_SANCTUARY (1 << 7) /* h Char protected by sanct. */ #define AFF_GROUP (1 << 8) /* i (R) Char is grouped */ #define AFF_CURSE (1 << 9) /* j Char is cursed */ #define AFF_INFRAVISION (1 << 10) /* k Char can see in dark */ #define AFF_POISON (1 << 11) /* l (R) Char is poisoned */ #define AFF_PROTECT_EVIL (1 << 12) /* m Char protected from evil */ #define AFF_PROTECT_GOOD (1 << 13) /* n Char protected from good */ #define AFF_SLEEP (1 << 14) /* o (R) Char magically asleep */ #define AFF_NOTRACK (1 << 15) /* p Char can't be tracked */ #define AFF_MEMORIZING (1 << 16) /* q (R) char is memorizing a spell */ #define AFF_HUNTING (1 << 17) /* r Char/Mob is hunting */ #define AFF_SNEAK (1 << 18) /* s Char can move quietly */ #define AFF_HIDE (1 << 19) /* t Char is hidden */ #define AFF_TAMED (1 << 20) /* u Char is tamed */ #define AFF_CHARM (1 << 21) /* v Char is charmed */ #define AFF_PARALYSIS (1 << 22) /* w Char is paralyzed */ #define AFF_FIRESHIELD (1 << 23) /* x Char is surrounded by a fireshield */ #define AFF_REGENERATION (1 << 24) /* y Char regen hp faster */ #define NUM_AFF_FLAGS 25 /* Modes of connectedness: used by descriptor_data.state */ #define CON_PLAYING 0 /* Playing - Nominal state */ #define CON_CLOSE 1 /* User disconnect, remove character. */ #define CON_GET_NAME 2 /* By what name ..? */ #define CON_NAME_CNFRM 3 /* Did I get that right, x? */ #define CON_PASSWORD 4 /* Password: */ #define CON_NEWPASSWD 5 /* Give me a password for x */ #define CON_CNFPASSWD 6 /* Please retype password: */ #define CON_QSEX 7 /* Sex? */ #define CON_QCLASS 8 /* Class? */ #define CON_RMOTD 9 /* PRESS RETURN after MOTD */ #define CON_MENU 10 /* Your choice: (main menu) */ #define CON_EXDESC 11 /* Enter a new description: */ #define CON_CHPWD_GETOLD 12 /* Changing passwd: get old */ #define CON_CHPWD_GETNEW 13 /* Changing passwd: get new */ #define CON_CHPWD_VRFY 14 /* Verify new password */ #define CON_DELCNF1 15 /* Delete confirmation 1 */ #define CON_DELCNF2 16 /* Delete confirmation 2 */ #define CON_DISCONNECT 17 /* In-game link loss (leave character) */ #define CON_LINE_INPUT 18 /* Question box */ #define CON_QRACE 19 /* Race? */ #define CON_QROLLSTATS 20 /* Roll stats */ /* Character equipment positions: used as index for char_data.equipment[] */ /* NOTE: Don't confuse these constants with the ITEM_ bitvectors which control the valid places you can wear a piece of 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_WAIST 13 #define WEAR_WRIST_R 14 #define WEAR_WRIST_L 15 #define WEAR_WIELD 16 #define WEAR_HOLD 17 #define WEAR_SHOULDERS 18 #define NUM_WEARS 19 /* This must be the # of eq positions!! */ /* object-related defines ********************************************/ /* Item types: used by obj_data.obj_flags.type_flag */ #define ITEM_LIGHT 1 /* Item is a light source */ #define ITEM_SCROLL 2 /* Item is a scroll */ #define ITEM_WAND 3 /* Item is a wand */ #define ITEM_STAFF 4 /* Item is a staff */ #define ITEM_WEAPON 5 /* Item is a weapon */ #define ITEM_FIREWEAPON 6 /* Item is a shooting weapon */ /* * Legenda campi value[] per ITEM_FIREWEAPON * * value[0] = weapon type ( see WEAPON_xxx ) * value[1] = range ( 1 - 3 ) * value[2] = <unused> * value[3] = <unused> */ #define ITEM_MISSILE 7 /* Item is a projectile */ /* * Legenda campi value[] per ITEM_MISSILE * * value[0] = type of ranged missile * value[1] = number of damage dice * value[2] = size of damage dice * value[3] = extra damage */ #define ITEM_TREASURE 8 /* Item is a treasure, not gold */ #define ITEM_ARMOR 9 /* Item is armor */ #define ITEM_POTION 10 /* Item is a potion */ #define ITEM_WORN 11 /* Used for enchanted jewelry.. */ #define ITEM_OTHER 12 /* Misc object */ #define ITEM_TRASH 13 /* Trash - shopkeeps won't buy */ #define ITEM_TRAP 14 /* Unimplemented */ #define ITEM_CONTAINER 15 /* Item is a container */ #define ITEM_NOTE 16 /* Item is note */ #define ITEM_DRINKCON 17 /* Item is a drink container */ #define ITEM_KEY 18 /* Item is a key */ #define ITEM_FOOD 19 /* Item is food */ #define ITEM_MONEY 20 /* Item is money (gold) */ #define ITEM_PEN 21 /* Item is a pen */ #define ITEM_BOAT 22 /* Item is a boat */ #define ITEM_FOUNTAIN 23 /* Item is a fountain */ /* used for random item generation */ #define ITEM_ARMOR_SHIELD 24 /* item is a shield */ #define ITEM_ARMOR_HELM 25 /* item is a helm */ #define ITEM_ARMOR_ARMS 26 /* item is a protecting arms armor */ #define ITEM_ARMOR_LEGS 27 /* item is a protecting legs armor */ #define ITEM_ARMOR_HANDS 28 /* item is a protecting hands armor */ #define ITEM_ARMOR_FEETS 29 /* item is a protecting feets armor */ #define ITEM_ARMOR_BELT 30 /* item is a belt */ /* end of random item generation dedicated defines */ #define ITEM_FURNITURE 31 /* item is a furniture */ /* * Legenda campi value[] per ITEM_FURNITURE * * value[0] = capacity * value[1] = num of people allowed * value[2] = max pos allowed * value[3] = type of furn */ #define ITEM_SPELLBOOK 32 /* item is a spellbook */ /* * Legenda campi value[] per ITEM_SPELLBOOK * * value[0] = type of spellbook * value[1] = <unused> * value[2] = <unused> * value[3] = <unused> */ #define ITEM_MISSILE_CONT 33 /* arrow/rocks/bolts container */ /* * Legenda campi value[] per ITEM_MISSILE_CONT * * value[0] = capacity * value[1] = ALWAYS 0 !!! * value[2] = missile types * value[3] = <unused> */ #define ITEM_TROPHY 34 /* item is a trophy */ #define ITEM_GOODS 35 /* item is a good */ /* * Legenda campi value[] per ITEM_GOODS * * value[0] = vnum of the goods in the goods_table[] * value[1] = vnum of the trading post that sold the goods * value[2] = <unused> * value[3] = <unused> */ #define ITEM_MAP 36 /* * Legenda campi value[] per ITEM_MAP * * value[0] = type of map (0 = sea course map) * value[1] = vnum of the course * value[2] = <unused> * value[3] = <unused> */ #define NUM_ITEM_TYPES 37 /* Take/Wear flags: used by obj_data.obj_flags.wear_flags */ #define ITEM_WEAR_TAKE (1 << 0) /* a Item can be takes */ #define ITEM_WEAR_FINGER (1 << 1) /* b Can be worn on finger */ #define ITEM_WEAR_NECK (1 << 2) /* c Can be worn around neck */ #define ITEM_WEAR_BODY (1 << 3) /* d Can be worn on body */ #define ITEM_WEAR_HEAD (1 << 4) /* e Can be worn on head */ #define ITEM_WEAR_LEGS (1 << 5) /* f Can be worn on legs */ #define ITEM_WEAR_FEET (1 << 6) /* g Can be worn on feet */ #define ITEM_WEAR_HANDS (1 << 7) /* h Can be worn on hands */ #define ITEM_WEAR_ARMS (1 << 8) /* i Can be worn on arms */ #define ITEM_WEAR_SHIELD (1 << 9) /* j Can be used as a shield */ #define ITEM_WEAR_ABOUT (1 << 10) /* k Can be worn about body */ #define ITEM_WEAR_WAIST (1 << 11) /* l Can be worn around waist */ #define ITEM_WEAR_WRIST (1 << 12) /* m Can be worn on wrist */ #define ITEM_WEAR_WIELD (1 << 13) /* n Can be wielded */ #define ITEM_WEAR_HOLD (1 << 14) /* o Can be held */ #define ITEM_WEAR_SHOULDER (1 << 15) /* p Can be worn on shoulders */ /* Extra object flags: used by obj_data.obj_flags.extra_flags */ #define ITEM_GLOW (1 << 0) /* a Item is glowing */ #define ITEM_HUM (1 << 1) /* b Item is humming */ #define ITEM_NOSAVE (1 << 2) /* c Item cannot be saved */ #define ITEM_NODONATE (1 << 3) /* d Item cannot be donated */ #define ITEM_NOINVIS (1 << 4) /* e Item cannot be made invis */ #define ITEM_INVISIBLE (1 << 5) /* f Item is invisible */ #define ITEM_MAGIC (1 << 6) /* g Item is magical */ #define ITEM_NODROP (1 << 7) /* h Item is cursed: can't drop */ #define ITEM_BLESS (1 << 8) /* i Item is blessed */ #define ITEM_FAST_MAGIC (1 << 9) /* j allow fast mana regen or spell mem */ #define ITEM_IS_SPELLBOOK (1 << 10) /* k Item has spellbook data attached */ #define ITEM_HAS_SPELLS (1 << 11) /* l Item has spell data attached */ #define ITEM_HAS_TRAPS (1 << 12) /* m Item has trap data attached */ #define ITEM_NODAMAGE (1 << 13) /* n Item cannot be damaged */ #define ITEM_DONATED (1 << 14) /* o Item is a donated items */ #define ITEM_UNUSED15 (1 << 15) /* p */ #define ITEM_NOSELL (1 << 16) /* q Shopkeepers won't touch it */ #define ITEM_UNIQUE (1 << 17) /* r Item is not in database */ /* Anti object flags: used by obj_data.obj_flags.anti_flags */ #define ITEM_ANTI_MORTAL (1 << 0) /* a Not usable by non-immortal ppl */ #define ITEM_ANTI_GOOD (1 << 1) /* b Not usable by good people */ #define ITEM_ANTI_EVIL (1 << 2) /* c Not usable by evil people */ #define ITEM_ANTI_NEUTRAL (1 << 3) /* d Not usable by neutral people */ #define ITEM_ANTI_MAGIC_USER (1 << 4) /* e Not usable by mages */ #define ITEM_ANTI_CLERIC (1 << 5) /* f Not usable by clerics */ #define ITEM_ANTI_THIEF (1 << 6) /* g Not usable by thieves */ #define ITEM_ANTI_WARRIOR (1 << 7) /* h Not usable by warriors */ #define ITEM_ANTI_SORCERER (1 << 8) /* i Not usable by sorcerers */ #define ITEM_ANTI_HUMAN (1 << 9) /* j Not usable by humans */ #define ITEM_ANTI_ELF (1 << 10) /* k Not usable by elves */ #define ITEM_ANTI_DWARF (1 << 11) /* l Not usable by dwarves */ /* types of ranged weapon */ #define WEAPON_BOW 1 /* shoots arrows */ #define WEAPON_SLING 2 /* shoots rocks */ #define WEAPON_CROSSBOW 3 /* shoots bolts */ #define MAX_RANGED_WEAPON 3 /* types of ranged missiles */ #define MISS_ARROW 1 /* bow missile */ #define MISS_ROCK 2 /* sling missile */ #define MISS_BOLT 3 /* crossbow missile */ /* Modifier constants used with obj affects ('A' fields) */ #define APPLY_NONE 0 /* No effect */ #define APPLY_STR 1 /* Apply to strength */ #define APPLY_DEX 2 /* Apply to dexterity */ #define APPLY_INT 3 /* Apply to constitution */ #define APPLY_WIS 4 /* Apply to wisdom */ #define APPLY_CON 5 /* Apply to constitution */ #define APPLY_CHA 6 /* Apply to charisma */ #define APPLY_CLASS 7 /* Reserved */ #define APPLY_LEVEL 8 /* Reserved */ #define APPLY_AGE 9 /* Apply to age */ #define APPLY_CHAR_WEIGHT 10 /* Apply to weight */ #define APPLY_CHAR_HEIGHT 11 /* Apply to height */ #define APPLY_MANA 12 /* Apply to max mana */ #define APPLY_HIT 13 /* Apply to max hit points */ #define APPLY_MOVE 14 /* Apply to max move points */ #define APPLY_GOLD 15 /* Reserved */ #define APPLY_EXP 16 /* Reserved */ #define APPLY_AC 17 /* Apply to Armor Class */ #define APPLY_HITROLL 18 /* Apply to hitroll */ #define APPLY_DAMROLL 19 /* Apply to damage roll */ #define APPLY_SAVING_PARA 20 /* Apply to save throw: paralz */ #define APPLY_SAVING_ROD 21 /* Apply to save throw: rods */ #define APPLY_SAVING_PETRI 22 /* Apply to save throw: petrif */ #define APPLY_SAVING_BREATH 23 /* Apply to save throw: breath */ #define APPLY_SAVING_SPELL 24 /* Apply to save throw: spells */ /* Container flags - value[1] */ #define CONT_CLOSEABLE (1 << 0) /* a Container can be closed */ #define CONT_PICKPROOF (1 << 1) /* b Container is pickproof */ #define CONT_CLOSED (1 << 2) /* c Container is closed */ #define CONT_LOCKED (1 << 3) /* d Container is locked */ /* Types of furniture */ #define FURN_THRONE 1 #define FURN_CHAIR 2 #define FURN_TABLE 3 #define FURN_BOOKCASE 4 #define FURN_BED 5 #define FURN_COUNTER 6 #define FURN_DESK 7 /* Some different kind of liquids for use in values of drink containers */ #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_CLEARWATER 15 /* other miscellaneous defines *******************************************/ /* Player conditions */ #define DRUNK 0 #define FULL 1 #define THIRST 2 /* Sun state for Sunlight */ #define SUN_DARK 0 #define SUN_RISE 1 #define SUN_LIGHT 2 #define SUN_SET 3 #define MOON_RISE 4 #define MOON_LIGHT 5 #define MOON_SET 6 /* Moon phases for MoonPhase */ #define MOON_NEW 0 #define MOON_WAXING_CRESCENT 1 #define MOON_WAXING_HALF 2 #define MOON_WAXING_THREE_QUARTERS 3 #define MOON_FULL 4 #define MOON_WANING_THREE_QUARTERS 5 #define MOON_WANING_HALF 6 #define MOON_WANING_CRESCENT 7 /* Seasons */ #define WINTER 0 #define SPRING 1 #define SUMMER 2 #define AUTUMN 3 #define NUM_SEASONS 4 /* ** ITEM TRAPS ************************************************** */ /* trap damage types */ #define TRAP_DAM_NONE 0 #define TRAP_DAM_SLEEP 1 #define TRAP_DAM_TELEPORT 2 #define TRAP_DAM_FIRE 3 #define TRAP_DAM_COLD 4 #define TRAP_DAM_ACID 5 #define TRAP_DAM_ENERGY 6 #define TRAP_DAM_BLUNT 7 #define TRAP_DAM_PIERCE 8 #define TRAP_DAM_SLASH 9 /* trap triggers */ #define TRAP_ACT_ROOM (1 << 0) /* a when ch enter the room */ #define TRAP_ACT_OPEN (1 << 1) /* b on open */ #define TRAP_ACT_CLOSE (1 << 2) /* c on close */ #define TRAP_ACT_GET (1 << 3) /* d on get */ #define TRAP_ACT_PUT (1 << 4) /* e on put */ #define TRAP_ACT_DROP (1 << 5) /* f on drop */ #define TRAP_ACT_GIVE (1 << 6) /* g on give */ #define TRAP_ACT_LOOKIN (1 << 7) /* f on look inside */ #define TRAP_ACT_USE (1 << 8) /* h when used (wear, wield, etc.) */ /* *************** ROOM TRIGGERS ***********************************************/ /* type of triggered events */ #define TRIG_NONE 0 /* No trigger dude! */ #define TRIG_TELEPORT 1 /* TELEPORT Event */ #define TRIG_COLLAPSE 2 /* COLLAPSE Event */ #define TRIG_EXPLOSION 3 /* EXPLOSION Event */ #define TRIG_HEAL 4 /* HEAL Event */ #define MAX_TRIG_TYPE 4 /* triggered events are activated by.. */ #define TRIG_WHO_ALL 0 /* Trigger by everybody */ #define TRIG_WHO_PC 1 /* Trigger by pc */ #define TRIG_WHO_NPC 2 /* Trigger by mob */ #define MAX_TRIG_WHO 2 /* action that activate the trigger */ #define TRIG_ACT_ENTER (1 << 0) /* a when enter in room */ #define TRIG_ACT_EXIT (1 << 1) /* b when exit from room */ #define TRIG_ACT_CAST (1 << 2) /* c when cast a spell */ #define TRIG_ACT_FIGHT_START (1 << 3) /* d when start a fight */ #define TRIG_ACT_FIGHT_END (1 << 4) /* e when start a fight */ #define TRIG_ACT_GET (1 << 5) /* f when get something */ #define TRIG_ACT_DROP (1 << 6) /* g when drop something */ #define TRIG_ACT_REST (1 << 7) /* h when rest */ #define TRIG_ACT_SLEEP (1 << 8) /* i when sleep */ #define TRIG_ACT_SPEAK (1 << 9) /* j when speak */ #define MAX_TRIG_ACT TRIG_ACT_SPEAK #define NUM_TRIG_ACT 10 #define MAX_TRIG_DELAY 10 /* other #defined constants **********************************************/ /* * **DO**NOT** blindly change the number of levels in your MUD merely by * changing these numbers and without changing the rest of the code to match. * Other changes throughout the code are required. See coding.doc for * details. * * LVL_IMPL should always be the HIGHEST possible immortal level, and * LVL_IMMORT should always be the LOWEST immortal level. The number of * mortal levels will always be LVL_IMMORT - 1. */ #define LVL_IMPL 34 #define LVL_GRGOD 33 #define LVL_GOD 32 #define LVL_IMMORT 31 /* Level of the 'freeze' command */ #define LVL_FREEZE LVL_GRGOD #define NUM_OF_EX_DIRS 6 /* number of directions in a room (nsewud) */ #define NUM_OF_DIRS 10 /* number of directions in a room (nsewud++++) */ #define MAGIC_NUMBER (0x06) /* Arbitrary number that won't be in a string */ /* * OPT_USEC determines how many commands will be processed by the MUD per * second and how frequently it does socket I/O. A low setting will cause * actions to be executed more frequently but will increase overhead due to * more cycling to check. A high setting (e.g. 1 Hz) may upset your players * as actions (such as large speedwalking chains) take longer to be executed. * You shouldn't need to adjust this. */ #define OPT_USEC 100000 /* 10 passes per second */ #define PASSES_PER_SEC (1000000 / OPT_USEC) #define RL_SEC * PASSES_PER_SEC #define PULSE_ZONE (10 RL_SEC) #define PULSE_MOBILE (10 RL_SEC) #define PULSE_VIOLENCE ( 2 RL_SEC) #define PULSE_AUTOSAVE (60 RL_SEC) #define PULSE_IDLEPWD (15 RL_SEC) #define PULSE_SANITY (30 RL_SEC) #define PULSE_USAGE (5 * 60 RL_SEC) /* 5 mins */ #define PULSE_TIMESAVE (30 * 60 RL_SEC) /* should be >= SECS_PER_MUD_HOUR */ #define PULSE_WILDREM (30 RL_SEC) #define PULSE_FERRYBOAT (60 RL_SEC) /* Variables for the output buffering system */ #define MAX_SOCK_BUF (12 * 1024) /* Size of kernel's sock buf */ #define MAX_PROMPT_LENGTH 96 /* Max length of prompt */ #define GARBAGE_SPACE 32 /* Space for **OVERFLOW** etc */ #define SMALL_BUFSIZE 1024 /* Static output buffer size */ /* Max amount of output that can be buffered */ #define LARGE_BUFSIZE (MAX_SOCK_BUF - GARBAGE_SPACE - MAX_PROMPT_LENGTH) #define HISTORY_SIZE 5 /* Keep last 5 commands. */ #define MAX_STRING_LENGTH 8192 #define MAX_INPUT_LENGTH 256 /* Max length per *line* of input */ #define MAX_RAW_INPUT_LENGTH 512 /* Max size of *raw* input */ #define MAX_MESSAGES 60 #define MAX_NAME_LENGTH 20 /* Max name length */ #define MAX_PWD_LENGTH 10 /* Max password length */ #define MAX_TITLE_LENGTH 80 /* Max title length */ #define HOST_LENGTH 30 #define EXDSCR_LENGTH 240 #define MAX_TONGUE 3 /* Max number of tongue */ #define MAX_SPELLS 500 /* Max number of spells */ #define MAX_SKILLS 800 /* Max number of skills */ #define MAX_AFFECT 32 /* Max character affection */ #define MAX_OBJ_AFF 6 /* Max object affection */ /* * A MAX_PWD_LENGTH of 10 will cause BSD-derived systems with MD5 passwords * and GNU libc 2 passwords to be truncated. On BSD this will enable anyone * with a name longer than 5 character to log in with any password. If you * have such a system, it is suggested you change the limit to 20. * * Please note that this will erase your player files. If you are not * prepared to do so, simply erase these lines but heed the above warning. */ #if defined(HAVE_UNSAFE_CRYPT) && MAX_PWD_LENGTH == 10 #error You need to increase MAX_PWD_LENGTH to at least 20. #error See the comment near these errors for more explanation. #endif /********************************************************************** * Structures * **********************************************************************/ typedef signed char sbyte; typedef unsigned char ubyte; typedef signed short int sh_int; typedef unsigned short int ush_int; #if !defined(__cplusplus) /* Anyone know a portable method? */ typedef char bool; #endif #if !defined(CIRCLE_WINDOWS) || defined(LCC_WIN32) /* Hm, sysdep.h? */ typedef char byte; #endif /* Various virtual (human-reference) number types. */ typedef int room_vnum; typedef int obj_vnum; typedef int mob_vnum; typedef int zone_vnum; typedef int shop_vnum; /* Various real (array-reference) number types. */ typedef int obj_rnum; typedef int mob_rnum; typedef int zone_rnum; typedef int shop_rnum; /* * Bitvector type for 32 bit unsigned long bitvectors. * 'unsigned long long' will give you at least 64 bits if you have GCC. * * Since we don't want to break the pfiles, you'll have to search throughout * the code for "bitvector_t" and change them yourself if you'd like this * extra flexibility. */ typedef unsigned long int bitvector_t; /* ======================================================================= */ typedef struct coord_data COORD_DATA; typedef struct extra_descr_data EXTRA_DESCR; typedef struct obj_flag_data OBJ_FLAG_DATA; typedef struct obj_affected_type OBJ_AFFECTED; typedef struct obj_spells_data OBJ_SPELLS_DATA; typedef struct obj_trap_data OBJ_TRAP_DATA; typedef struct obj_data OBJ_DATA; typedef struct terrain_data TERRAIN_DATA; typedef struct room_direction_data EXIT_DATA; typedef struct room_affection_data ROOM_AFFECT; typedef struct room_extra_data ROOM_EXTRA; typedef struct room_trigger_data TRIGGER_DATA; typedef struct room_data ROOM_DATA; typedef struct memory_rec_struct MEMORY_REC; typedef struct time_info_data TIME_INFO_DATA; typedef struct time_data TIME_DATA; typedef struct char_player_data PLAYER_DATA; typedef struct char_ability_data CHAR_ABIL_DATA; typedef struct char_point_data CHAR_POINT_DATA; typedef struct known_data KNOWN_DATA; typedef struct known_course KNOWN_COURSE; typedef struct player_special_data PLAYER_SPECIAL; typedef struct mob_special_data MOB_SPECIAL; typedef struct affected_type AFFECTED_DATA; typedef struct follow_type FOLLOW_DATA; typedef struct char_data CHAR_DATA; typedef struct txt_block TXT_BLOCK; typedef struct txt_q TXT_Q; typedef struct descriptor_data DESCRIPTOR_DATA; typedef struct msg_type MSG_TYPE; typedef struct message_type MESSAGE_TYPE; typedef struct message_list MESSAGE_LIST; typedef struct weather_data WEATHER_DATA; typedef struct weapon_prof_data WEAPON_PROF; typedef struct index_data INDEX_DATA; typedef struct who_list WHO_LIST; typedef struct q_element_data Q_ELEM_DATA; typedef struct queue_data QUEUE_DATA; typedef struct event_data EVENT_DATA; typedef struct book_page_data BOOK_PAGE; typedef struct spellbook_data SPELLBOOK; typedef struct book_type_data BOOK_TYPE; typedef struct wild_remove WILD_REMOVE; typedef struct life_data LIFE_DATA; typedef struct wild_data WILD_DATA; typedef struct survey_data SURVEY_DATA; typedef struct pstone_data PSTONE_DATA; typedef struct yoke_data YOKE_DATA; typedef struct vehicle_points_data VEHICLE_PTS; typedef struct vehicle_index VEHICLE_INDEX; typedef struct vehicle_data VEHICLE_DATA; typedef struct stable_rent_data STABLE_RENT; typedef struct auth_data AUTH_DATA; typedef struct building_points_data BUILDING_PTS; typedef struct building_commands BUILDING_CMD; typedef struct building_type_data BUILDING_TYPE; typedef struct building_works BLD_WORKS; typedef struct building_data BUILDING_DATA; typedef struct ship_value_data SHIP_VAL_DATA; typedef struct ship_type_data SHIP_TYPE; typedef struct ship_data SHIP_DATA; typedef struct port_data PORT_DATA; typedef struct course_data COURSE_DATA; typedef struct course_step COURSE_STEP; typedef struct ferry_data FERRY_DATA; typedef struct good_type_data GOOD_TYPE; typedef struct good_data GOOD_DATA; typedef struct trading_post_data TRADING_POST; typedef struct trp_good_data TRP_GOOD; typedef struct market_vars MARKET_VARS; typedef struct market_affections MARKET_AFF; typedef struct market_data MARKET_DATA; typedef struct market_good_data MARKET_GOOD; /* db.h */ typedef struct reset_com RESET_COM; typedef struct zone_data ZONE_DATA; typedef struct zone_wild_data ZONE_WILD; typedef struct reset_q_element RESET_Q_ELEM; typedef struct reset_q_type RESET_Q_TYPE; typedef struct player_index_element PLR_INDEX_ELEM; typedef struct help_index_element HELP_INDEX_ELEM; typedef struct ban_list_element BAN_LIST_ELEM; /* interpreter.h */ typedef struct command_info COMMAND_INFO; typedef struct alias_data ALIAS_DATA; /* shop.h */ typedef struct stack_data STACK_DATA; /* In Spells.h */ typedef struct spell_info_type SPELL_INFO_DATA; typedef struct attack_hit_type ATTACK_HIT_TYPE; /* house.h */ typedef struct house_control_rec HOUSE_CONTROL; /* ======================================================================= */ /* Coordinate structure: for wilderness usage */ struct coord_data { sh_int x; sh_int y; sh_int level; }; /* Extra description: used in objects, mobiles, and rooms */ struct extra_descr_data { EXTRA_DESCR *next; /* Next in list */ char *keyword; /* Keyword in look/examine */ char *description; /* What to see */ }; /* object-related structures ******************************************/ /* object flags; used in obj_data */ struct obj_flag_data { byte type_flag; /* Type of item */ int value[4]; /* Values of the item (see list) */ int wear_flags; /* Where you can wear it */ int extra_flags; /* If it hums, glows, etc. */ int anti_flags; /* anti-mage, anti-cleric, anti-evil,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 */ int level; /* Level of item */ int cond; /* Current item condition */ int maxcond; /* Max item condition */ int quality; /* Item quality */ long bitvector; /* To set chars bits */ long owner_id; /* who is the owner of the object? */ }; /* Object affection */ struct obj_affected_type { byte location; /* Which ability to change (APPLY_XXX) */ sbyte modifier; /* How much it changes by */ }; /* Spells attached to items */ struct obj_spells_data { OBJ_SPELLS_DATA *next; /* link to the next node */ sh_int spellnum; /* number of the spell */ sh_int level; /* level at which it will be cast */ sh_int percent; /* % of success */ }; /* for Trapped Items */ struct obj_trap_data { OBJ_TRAP_DATA *next; /* link to the next node */ bool whole_room; /* Just ch or the whole room? */ int action; /* Action that trigger the trap */ int dam_type; /* Which damage cause the trap */ int charges; /* How many times the trap act */ }; /* ================== Memory Structure for Objects ================== */ struct obj_data { OBJ_DATA *next; /* For the object list */ OBJ_DATA *prev; /* For the object list */ OBJ_DATA *next_content; /* For 'contains' lists */ OBJ_DATA *prev_content; /* For 'contains' lists */ OBJ_DATA *first_content; /* Contains objects */ OBJ_DATA *last_content; /* Contains objects */ OBJ_DATA *in_obj; /* In what object NULL when none */ EXTRA_DESCR *ex_description; /* extra descriptions */ ROOM_DATA *in_room; /* In what room -1 when conta/carr */ CHAR_DATA *carried_by; /* Carried by :NULL in room/conta */ CHAR_DATA *worn_by; /* Worn by? */ CHAR_DATA *people; /* List of people using a furniture obj */ VEHICLE_DATA *in_vehicle; /* In which vehicle? */ EVENT_DATA *action; /* event for action which takes time */ OBJ_FLAG_DATA obj_flags; /* Object information */ OBJ_AFFECTED affected[MAX_OBJ_AFF]; /* affects */ byte light; /* Number of lightsources for furniture */ 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 */ sh_int worn_on; /* Worn where? */ int count; /* number of same objects */ obj_vnum item_number; /* Where in data-base */ void *special; /* for special data attached on items */ }; /* ======================================================================= */ /* room-related structures ************************************************/ /* ex sector_type */ struct terrain_data { char *name; /* Sector name */ char *description; /* Sector description (when entered) */ char *map; /* normal map (with symbols) */ char *map2; /* map with letters (aAnmvb etc) */ char *mapbw; /* map for black and white */ sh_int movement_loss; /* cost in movement points */ }; /* room's exits data */ struct room_direction_data { EXIT_DATA *next; /* next exit in room linked list */ EXIT_DATA *prev; /* prev exit in room linked list */ EXIT_DATA *rexit; /* Reverse exit pointer */ ROOM_DATA *to_room; /* Where direction leads (NULL) */ COORD_DATA *coord; /* for wilderness use */ COORD_DATA *rvcoord; /* for wilderness use */ char *description; /* When look DIR. */ char *keyword; /* for open/close */ sh_int exit_info; /* Exit info */ int vdir; /* Physical "direction" */ obj_vnum key; /* Key's number (-1 for no key) */ room_vnum vnum; /* VNum of destination */ room_vnum rvnum; /* Vnum of room in opposite dir */ }; /* room's affections data */ struct room_affection_data { ROOM_AFFECT *next; ROOM_AFFECT *next_in_room; COORD_DATA *coord; /* coord of the room (for wild usage) */ room_vnum vroom; /* vnum of the room */ char *text; /* some useful spot */ int timer; /* how many ticks this affection lasts */ int bitvector; /* Tells which bits to set (RAFF_xxx) */ int spell; /* the spell number */ int level; /* level of the spell */ int value; /* some useful spot */ }; /* extra data (mainly for buildings) */ struct room_extra_data { int vnum; /* building/ship vnum */ sh_int max_hp; /* max room hp */ sh_int curr_hp; /* curr room hp */ }; /* room triggered events data */ struct room_trigger_data { TRIGGER_DATA *next; /* link to the next global node */ bool active; /* is trigger active? */ char *text; /* some useful spot */ int type; /* type of trigger */ int whotrig; /* who trig the event? */ int action; /* triggered by which action? */ int timer; /* delay for event */ int random; /* event is sure or has random % ? */ int value[4]; /* see room_trigger.c */ }; /* ================== Memory Structure for room ======================= */ struct room_data { ROOM_DATA *next; COORD_DATA *coord; /* wilderness */ OBJ_DATA *first_content; /* Head of list of items in room */ OBJ_DATA *last_content; /* Tail of list of items in room */ CHAR_DATA *people; /* List of NPC / PC in room */ EXTRA_DESCR *ex_description; /* for examine/look */ EXIT_DATA *first_exit; /* Directions */ EXIT_DATA *last_exit; /* Directions */ BUILDING_DATA *buildings; /* list of buildings in room */ VEHICLE_DATA *vehicles; /* list of vehicles in room */ SHIP_DATA *ships; /* List of Ships in room */ FERRY_DATA *ferryboat; /* one single ferryboat in each room */ ROOM_AFFECT *affections; /* list of room affections */ EVENT_DATA *action; /* event for action which takes time */ PSTONE_DATA *portal_stone; /* a single portal stone in each room */ ROOM_EXTRA *extra_data; /* for ship/building rooms */ TRIGGER_DATA *trigger; /* For triggered events */ byte light; /* Number of lightsources in room */ char *name; /* Rooms name 'You are ...' */ char *description; /* Shown when entered */ int sector_type; /* sector type (move/hide) */ int room_flags; /* DEATH,DARK ... etc */ int room_affs; /* Room affections */ room_vnum number; /* Rooms number (vnum) */ zone_rnum zone; /* Room zone (for resetting) */ SPECIAL(*func); /* Special procedure */ }; /* ====================================================================== */ /* char-related structures ************************************************/ /* memory structure for characters */ struct memory_rec_struct { MEMORY_REC *next; long id; }; /* This structure is purely intended to be an easy way to transfer */ /* and return information about time (real or mudwise). */ struct time_info_data { int hours; int day; int month; sh_int year; }; /* 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 */ }; /* general player-related info, usually PC's and NPC's */ struct char_player_data { CHAR_DATA *fighting; /* Opponent */ CHAR_DATA *riding; /* PC/NPC is Mounted */ CHAR_DATA *hunting; /* Char hunted by this char */ VEHICLE_DATA *drive_vehicle; /* Is driving a vehicle? */ TIME_DATA time; /* PC's AGE in days */ byte sex; /* PC / NPC's sex */ byte chclass; /* PC / NPC's class */ byte race; /* PC / NPC's race */ byte level; /* PC / NPC's level */ byte position; /* Standing, fighting, sleeping, etc. */ byte carry_items; /* Number of items carried */ sbyte clan; /* PC's clan vnum */ sbyte clan_rank; /* PC's clan rank */ ubyte weight; /* PC / NPC's weight */ ubyte height; /* PC / NPC's height */ char *name; /* PC / NPC s name (kill ... ) */ char *short_descr; /* for NPC 'actions' */ char *long_descr; /* for 'look' */ char *description; /* Extra descriptions */ char *title; /* PC / NPC's title */ char passwd[MAX_PWD_LENGTH+1]; /* character's password */ sh_int apply_saving_throw[5]; /* Saving throw (Bonuses) */ int hometown; /* PC s Hometown (zone) */ int carry_weight; /* Carried weight */ int timer; /* Timer for update */ int alignment; /* +-1000 for alignments */ long idnum; /* player's idnum; -1 for mobiles */ long act; /* act flag for NPC's; player flag for PC's */ long affected_by; /* Bitvector for spells/skills affected by */ }; /* Char's abilities */ struct char_ability_data { sh_int str; sh_int intel; sh_int wis; sh_int dex; sh_int con; sh_int cha; }; /* Char's points */ struct char_point_data { sh_int mana; sh_int max_mana; /* Max mana for PC/NPC */ sh_int hit; sh_int max_hit; /* Max hit for PC/NPC */ sh_int move; sh_int max_move; /* Max move for PC/NPC */ sh_int armor; /* Internal -100..100, ext. -10..10 AC */ int bank_gold; /* Gold the char has in a bank account */ int exp; /* The total experience of the player */ sh_int hitroll; /* Any bonus or penalty to the hit roll */ sh_int damroll; /* Any bonus or penalty to the dam roll */ }; /* introduction code */ struct known_data { KNOWN_DATA *next; /* next node in list */ KNOWN_DATA *prev; /* prev node in list */ char *name; /* by which name he's known */ long idnum; /* idnum of the known player */ }; struct known_course { KNOWN_COURSE *next; int coursenum; }; /* * Specials needed only by PCs, not NPCs. Space for this structure is * not allocated in memory for NPCs, but it is for PCs. */ struct player_special_data { ALIAS_DATA *aliases; /* Character's aliases */ KNOWN_DATA *first_known; /* introduction code */ KNOWN_DATA *last_known; /* introduction code */ KNOWN_COURSE *courses; /* known sail courses */ COORD_DATA *load_coord; /* Which coord to place char in */ char *poofin; /* Description on arrival of a god. */ char *poofout; /* Description upon a god's exit. */ char *host; /* player host */ char **wildmap; /* player wild map */ bool talks[MAX_TONGUE]; /* PC s Tongues 0 for NPC */ bool athelm; /* Is manouvering a ship */ byte skills[MAX_SKILLS+1]; /* array of skills plus skill 0 */ byte spells_mem[MAX_SPELLS+1]; /* array of memorized spells */ byte PADDING0; /* used to be spells_to_learn */ byte freeze_level; /* Level of god who froze char, if any */ sbyte conditions[3]; /* Drunk, full, thirsty */ ubyte bad_pws; /* number of bad password attemps */ sh_int invis_level; /* level of invisibility */ int wimp_level; /* Below this # of hit points, flee! */ int spells_to_learn; /* How many can you learn yet this level*/ int mob_kills; /* how many mobs has killed? */ int mob_deaths; /* how many times has been killed by mobs?*/ int plr_kills; /* how many players has killed? */ int plr_deaths; /* how many times has been killed by plr?*/ int load_building; /* Which building to place char in */ int load_ship; /* which ship to place char in */ int tot_level; /* total level */ long multiclass; /* bitvector of completed classes */ long last_tell; /* idnum of last tell from */ long pref; /* preference flags for PC's. */ room_vnum load_room; /* Which room to place char in */ /* Killing same mobs XP penalties arrays */ mob_vnum kills_vnum[100]; /* Virtual numbers of the mobs killed */ ush_int kills_amount[100]; /* Number of mobs of that type killed */ byte kills_curpos; /* Current position in array */ }; /* Specials used by NPCs, not PCs */ struct mob_special_data { CHAR_DATA *ridden_by; /* mob being mounted */ VEHICLE_DATA *hitched_to; /* Is mob dragging a vehicle? */ YOKE_DATA *yoke; /* for yokeing pointers list */ MEMORY_REC *memory; /* List of attackers to remember */ byte default_pos; /* Default position for NPC */ byte damnodice; /* The number of damage dice's */ byte damsizedice; /* The size of the damage dice's */ byte maxfactor; /* Max number of kills of mob allowed */ sh_int timer; /* used to extract encounter mobs */ int attack_type; /* The Attack Type Bitvector for NPC's */ int gold; /* Money carried */ long owner_id; /* Mob is owned by this pc */ }; /* An affect structure */ struct affected_type { AFFECTED_DATA *next; byte location; /* Tells which ability to change(APPLY_XXX) */ sbyte modifier; /* This is added to apropriate ability */ sh_int type; /* The type of spell that caused this */ sh_int duration; /* For how long its effects will last */ long bitvector; /* Tells which bits to set (AFF_XXX) */ }; /* Structure used for chars following other chars */ struct follow_type { FOLLOW_DATA *next; CHAR_DATA *follower; }; /* ================== Structure for player/non-player ===================== */ struct char_data { CHAR_DATA *next; /* For either mobs or ppl-list */ CHAR_DATA *next_in_room; /* For room->people list */ CHAR_DATA *next_in_obj; /* For obj->people list */ CHAR_DATA *next_in_building; /* For building->people list */ CHAR_DATA *next_in_vehicle; /* For vehicle/ship->people list */ CHAR_DATA *next_fighting; /* For fighting list */ CHAR_DATA *master; /* Who is char following? */ FOLLOW_DATA *followers; /* List of chars followers */ DESCRIPTOR_DATA *desc; /* NULL for mobiles */ OBJ_DATA *equipment[NUM_WEARS]; /* Equipment array */ OBJ_DATA *first_carrying; /* Head of object list */ OBJ_DATA *last_carrying; /* Tail of object list */ OBJ_DATA *in_obj; /* Furniture objects */ ROOM_DATA *in_room; /* Location (real room number) */ ROOM_DATA *was_in_room; /* location for linkdead people */ ROOM_DATA *last_room; BUILDING_DATA *in_building; /* In which building */ SHIP_DATA *in_ship; /* Char is on a ship? */ VEHICLE_DATA *in_vehicle; /* Is inside a vehicle? */ PLAYER_SPECIAL *player_specials; /* PC specials */ AFFECTED_DATA *affected; /* affected by what spells */ EVENT_DATA *action; /* event for action which takes time */ PLAYER_DATA player; /* Normal data */ CHAR_ABIL_DATA real_abils; /* Abilities without modifiers */ CHAR_ABIL_DATA aff_abils; /* Abils with spells/stones/etc */ CHAR_POINT_DATA points; /* Points */ MOB_SPECIAL mob_specials; /* NPC specials */ int pfilepos; /* playerfile pos */ int wait; /* wait for how many loops */ mob_rnum nr; /* Mob's rnum */ }; /* ====================================================================== */ /* descriptor-related structures ******************************************/ struct txt_block { TXT_BLOCK *next; char *text; int aliased; }; struct txt_q { TXT_BLOCK *head; TXT_BLOCK *tail; }; struct descriptor_data { DESCRIPTOR_DATA *next; /* link to next descriptor */ DESCRIPTOR_DATA *snooping; /* Who is this char snooping */ DESCRIPTOR_DATA *snoop_by; /* And who is snooping this char */ CHAR_DATA *character; /* linked to char */ CHAR_DATA *original; /* original char if switched */ TXT_BLOCK *large_outbuf; /* ptr to large buffer, if we need it */ TXT_Q input; /* q of unprocessed input */ socket_t descriptor; /* file descriptor for socket */ char host[HOST_LENGTH+1]; /* hostname */ byte bad_pws; /* number of bad pw attemps this login */ byte idle_tics; /* tics idle at password prompt */ int connected; /* mode of 'connectedness' */ int desc_num; /* unique num assigned to desc */ time_t login_time; /* when the person connected */ char *showstr_head; /* for keeping track of an internal str */ char **showstr_vector; /* for paging through texts */ int showstr_count; /* number of pages to page through */ int showstr_page; /* which page are we currently showing? */ char **str; /* for the modify-str system */ size_t max_str; /* - */ long mail_to; /* name for mail system */ int has_prompt; /* is the user at a prompt? */ char inbuf[MAX_RAW_INPUT_LENGTH]; /* buffer for raw input */ char last_input[MAX_INPUT_LENGTH]; /* the last input */ char small_outbuf[SMALL_BUFSIZE]; /* standard output buffer */ char *output; /* ptr to the current output buffer */ char **history; /* History of commands, for ! mostly. */ int history_pos; /* Circular array position. */ int bufptr; /* ptr to end of current output */ int bufspace; /* space left in the output buffer */ C_FUNC(*callback); /* Call back function */ int callback_depth; /* Call back "psuedo-recursiveness" depth */ void *c_data; /* Storage for the Callback function */ }; /* other miscellaneous structures ***************************************/ typedef struct name_number NAME_NUMBER; struct name_number { char *name; int number; }; struct msg_type { char *attacker_msg; /* message to attacker */ char *victim_msg; /* message to victim */ char *room_msg; /* message to room */ }; struct message_type { MESSAGE_TYPE *next; /* to next messages of this kind. */ MSG_TYPE die_msg; /* messages when death */ MSG_TYPE miss_msg; /* messages when miss */ MSG_TYPE hit_msg; /* messages when hit */ MSG_TYPE god_msg; /* messages when hit on god */ }; struct message_list { MESSAGE_TYPE *msg; /* List of messages. */ int a_type; /* Attack type */ int number_of_attacks; /* How many attack messages to chose from. */ }; 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 practices player gains per lev */ }; struct int_app_type { byte learn; /* how many % a player learns a spell/skill */ byte memspl; /* bonus on how many spells a player can memorize */ }; struct con_app_type { sh_int hitp; sh_int shock; }; #define PROF_LVL_START 3 struct weapon_prof_data { sh_int to_hit; sh_int to_dam; sh_int to_ac; sh_int num_of_attacks; }; /* element in monster and object index-tables */ struct index_data { int vnum; /* virtual number of this mob/obj */ int number; /* number of existing units of this mob/obj */ SPECIAL(*func); }; struct who_list { WHO_LIST *next; char *name; int level; }; struct auth_data { AUTH_DATA *next; /* next node in authorization list */ long id_num; /* player id num */ char *name; /* player name (for fast display) */ }; /* =================================================================== */ /* W E A T H E R */ /* =================================================================== */ struct weather_data { sh_int temp; // temperature sh_int humidity; // humidity sh_int precip_rate; // precipitation rate sh_int precip_change; // precipitation change sh_int wind_dir; // wind direction sh_int windspeed; // wind speed sh_int pressure; // pressure sh_int pressure_change; // change of pressure ush_int free_energy; }; /* =================================================================== */ /* E V E N T S */ /* =================================================================== */ /* number of queues to use (reduces enqueue cost) */ #define NUM_EVENT_QUEUES 10 struct q_element_data { Q_ELEM_DATA *next; Q_ELEM_DATA *prev; void *data; long key; }; struct queue_data { Q_ELEM_DATA *head[NUM_EVENT_QUEUES]; Q_ELEM_DATA *tail[NUM_EVENT_QUEUES]; }; struct event_data { Q_ELEM_DATA *q_el; void *event_obj; EVENTFUNC(*func); }; /* Things that use events */ typedef struct ship_sail_event SAIL_EVENT; typedef struct room_teleport_event ROOM_TELEPORT; typedef struct room_heal_event ROOM_HEAL; typedef struct camp_event CAMP_EVENT; typedef struct ferry_move_event FERRY_EVENT; struct ship_sail_event { SHIP_DATA *ship; sh_int type; }; struct room_teleport_event { CHAR_DATA *ch; ROOM_DATA *orig_room; ROOM_DATA *target; char *msg_to_char; char *msg_to_room; int delay; }; struct room_heal_event { CHAR_DATA *ch; ROOM_DATA *orig_room; char *msg_to_char; char *msg_to_room; int delay; }; struct camp_event { CHAR_DATA *ch; ROOM_DATA *pRoom; }; struct ferry_move_event { FERRY_DATA *ferry; sh_int dir; }; /* =================================================================== */ /* S P E L L B O O K S */ /* =================================================================== */ #define BOOK_TRAVELLING 0 #define BOOK_BOOK 1 #define BOOK_TOME 2 #define PAGE_BLANK 0 #define PAGE_WRITTEN 1 #define PAGE_RUINED 2 #define MIN_PAGES 3 struct book_page_data { BOOK_PAGE *next; /* pointer to the next page */ BOOK_PAGE *prev; /* pointer to the prev page */ char *spellname; /* name of the spell */ sh_int status; /* page status */ sh_int flags; /* page blank/written */ sh_int spellnum; /* num of the spell written in the page */ }; struct spellbook_data { BOOK_PAGE *first_page; /* first book page */ BOOK_PAGE *last_page; /* last book page */ sh_int type; /* type of spellbook */ sh_int num_of_spells; /* how many spells the book contains */ sh_int num_of_pages; /* how many pages are in the book */ }; struct book_type_data { sh_int max_num_pages; sh_int mult; }; /* ==================================================================== */ /* W I L D E R N E S S */ /* ==================================================================== */ #define WILD_ZONE 5000 #define WILD_Y 2000 #define WILD_X 2000 #define MAP_SIZE 20 #define MAP_X (MAP_SIZE * 3) #define MAP_Y (MAP_SIZE * 3) #define MAP_WEATH_Y (WILD_Y / MAP_SIZE) #define MAP_WEATH_X (WILD_X / MAP_SIZE) #define WILD_HASH 41 #define WDATA_HASH 11 #define SECT_HASH 11 #define MAX_SURVEY_DIST 50 /* max distance for survey */ #define MAX_TRACK_DIST 20 /* max distance for track */ //#define MAX_SAIL_DIST 30 /* max distance for sailing */ #define MAX_SCAN_DIST 5 /* max distance for scanning */ #define WS_ADD_ROOM 0 #define WS_REM_ROOM 1 #define MAX_LNK_STONE 5 #define MOD_Y 6 #define MOD_X 8 #define MOD_SMALL_Y 2 #define MOD_SMALL_X 3 #define RADIUS_BASE 7 #define RADIUS_SMALL 3 struct wild_remove { WILD_REMOVE *next; ROOM_DATA *wRoom; int timer; }; struct life_data { LIFE_DATA *next; char *name; /* encounter name */ sh_int sect; /* type of terrain */ sh_int num_max; /* max number */ sh_int num_min; /* min number */ sh_int num_curr; /* current number (used only in wd-> ) */ int vnum; /* mob vnum */ float regen_rate; /* how many units repop per mud day */ }; /* Wilderness Sector Data */ struct wild_data { WILD_DATA *next; /* next node in global list */ COORD_DATA *coord; /* coordinates */ LIFE_DATA *life_table[SECT_HASH]; /* encounters table */ char ws_map[MAP_SIZE][MAP_SIZE+3]; /* wildsector ascii map */ sh_int num_of_rooms; /* number of currently loaded rooms */ time_t last_load; /* last time it has been loaded */ }; struct survey_data { SURVEY_DATA *next; COORD_DATA *coord; char *descriz; }; struct pstone_data { PSTONE_DATA *next; /* next node in global dble linked list */ PSTONE_DATA *prev; /* next node in global dble linked list */ COORD_DATA coord; /* coord where to place the pstone */ char *name; /* keyword list for 'travel' cmd */ char *short_descr; /* for lists_stone_in_room */ char *description; /* for examine, look at, etc */ sh_int vnum; /* stone vnum */ sh_int link_to[MAX_LNK_STONE]; /* vnum of stones linked with this one */ }; /* ==================================================================== */ /* B U I L D I N G S */ /* ==================================================================== */ #define BUILDING_ZONE 5001 #define BLD_HASH 11 /* types of buildings */ #define BLD_HUT 0 #define BLD_HOUSE 1 #define BLD_STABLE 2 #define BLD_STORE 3 #define BLD_WORKSHOP 4 #define BLD_CASTLE 5 /* TODO template!!!! */ #define NUM_BUILDING_TYPE 10 /* who own the building? */ #define BLD_OWN_CHAR 1 /* a single char own the building */ #define BLD_OWN_CLAN 2 /* a clan building */ /* who can enter the building */ #define BLD_ENT_FREE 0 /* everybody can enter */ #define BLD_ENT_CHAR 1 /* owner and authorized only */ #define BLD_ENT_CLAN 2 /* clan members and authorized only */ /* building flags */ #define BLD_F_CLANHALL (1 << 0) /* building is the clanhall of a clan */ #define BLD_F_RUIN (1 << 1) /* building is destroyed */ /* max number of defending mobs */ #define BLD_MAX_MOB 5 /* build works phases */ #define BWKS_BASE 1 #define BWKS_WALLS 2 #define BWKS_FINAL 3 struct building_points_data { sh_int health; sh_int defense; sh_int npc_attack; /* for auto-defending building ie Towers */ sh_int mob_attack; /* for auto-generating defenders mobs */ }; /* * commands for loading objects, mobs and other things on building * * valid commands are: * * Load a mobile: M <mob vnum> <quantity> <building room vnum> <unused> * Load an object: O <obj vnum> <quantity> <building room vnum> <unused> * */ struct building_commands { BUILDING_CMD *next; char cmd; /* type of command */ int arg[4]; /* 4 integer arguments */ }; struct building_type_data { BUILDING_CMD *cmds_list; /* list of "reset" commands */ BUILDING_PTS range_min; /* for random bld points generation */ BUILDING_PTS range_max; /* = */ char *name; /* name of the building type */ int vnum; /* type of building (see above) */ int size; /* number of rooms */ int entrance; /* entrance position in **rooms array */ int cost; /* building cost (in GOLD coins) */ mob_vnum vmob[BLD_MAX_MOB]; /* vnum of defenders mobs */ }; struct building_works { BLD_WORKS *next; /* next node in global list */ BLD_WORKS *prev; /* prev node in global list */ COORD_DATA *coord; /* at which coord we're building? */ ROOM_DATA *in_room; /* in which room we're building? */ bool authorized; /* are building works authorized ? */ long owner_id; /* building owner id */ sh_int owner_type; /* this is a clan building or a private one? */ sh_int timer; /* how log before this work phase end? */ sh_int phase; /* in which work phase are we? */ int type; /* code of building type */ int num; /* work number (for contracts) */ }; struct building_data { BUILDING_DATA *next; /* for next node in global list */ BUILDING_DATA *next_in_room; /* for room->buildings list */ BUILDING_CMD *cmds_list; /* list of "reset" commands */ COORD_DATA *coord; /* for building location in wilderness */ BUILDING_TYPE *type; /* prototype of the building */ ROOM_DATA *in_room; /* in which room is placed */ ROOM_DATA **rooms; /* rooms list */ CHAR_DATA *people; /* list of people inside */ TRADING_POST *trp; /* for trading post usage */ AUTH_DATA *auth; /* list of people authorized to enter */ BUILDING_PTS max_val; BUILDING_PTS curr_val; char *keyword; /* for enter, attack, look, etc. */ char *description; /* for look at room, etc. */ char can_enter; /* who can enter (see above) */ char owner_type; /* type of owner (see above) */ sh_int size; /* size in rooms of the building */ int owner_id; /* player id num or clan vnum */ int vnum; /* building vnum */ int flags; /* building flags */ mob_vnum vmob[BLD_MAX_MOB]; /* vnum of defenders mobs */ room_vnum vnum_room; /* for building in zones */ }; /* ========================================================== */ /* ==================================================================== */ /* V E H I C L E S */ /* ==================================================================== */ #define VEH_CART 0 #define VEH_WAGON 1 #define MAX_VEH_TYPE 10 #define VEH_FLY (1 << 0) #define VEH_INVISIBLE (1 << 1) #define VEH_DESTROYED (1 << 2) struct yoke_data { YOKE_DATA *next; YOKE_DATA *prev; CHAR_DATA *mob; }; struct vehicle_points_data { sh_int speed; /* !UNUSED! how fast it moves */ sh_int capacity; /* how much it can contains */ sh_int health; /* how much damage it can suffer */ sh_int passengers; /* how many people can go inside */ sh_int draft_mobs; /* how many draft animals it can have */ }; struct vehicle_index { VEHICLE_PTS value; char *name; /* keyword list */ char *short_description; /* displayed in look_at_room et similar */ char *description; /* displayed in look_at_target etc. */ sh_int vnum; /* vnum of vehicle proto */ }; struct vehicle_data { VEHICLE_DATA *next; /* next node in global list */ VEHICLE_DATA *prev; /* prev node in global list */ VEHICLE_DATA *next_in_room; /* next node in room list */ VEHICLE_INDEX *type; ROOM_DATA *in_room; /* in which room is? */ ROOM_DATA *last_room; /* in which room was? */ ROOM_DATA *veh_room; /* room for placing people */ CHAR_DATA *people; /* list of people inside the vehicle */ CHAR_DATA *wagoner; /* who's driving the vehicle? */ OBJ_DATA *first_content; /* list of loaded goods */ OBJ_DATA *last_content; /* list of loaded goods */ YOKE_DATA *first_yoke; YOKE_DATA *last_yoke; VEHICLE_PTS max_val; VEHICLE_PTS curr_val; char *name; /* keyword list */ char *short_description; /* displayed in look_at_room et similar */ char *description; /* displayed in look_at_target etc. */ int flags; /* vehicle bitvector */ long owner_id; /* who's the vehicle owner? */ }; /* ==================================================================== */ /* Stables for renting mounts */ /* ==================================================================== */ #define ST_RENT_NONE 0 #define ST_RENT_MOUNT 1 #define ST_RENT_VEHICLE 2 struct stable_rent_data { STABLE_RENT *next; STABLE_RENT *prev; char *filename; char *playername; char *typedescr; sh_int type; room_vnum stable_vnum; long id_player; }; /* ==================================================================== */ /* S H I P S */ /* ==================================================================== */ #define SHIP_ZONE 5002 #define NUM_SHIP_TYPE 10 #define SHIP_SPEED_BASE 20 #define SAIL_MANUAL 1 #define SAIL_COURSE 2 #define SHIP_IN_PORT (1 << 0) #define SHIP_SAIL (1 << 1) #define SHIP_COMBAT (1 << 2) #define SHIP_AT_ANCHOR (1 << 3) #define SHIP_IN_COURSE (1 << 4) struct ship_value_data { sh_int speed; sh_int power; sh_int defense; sh_int equip; /* crew */ sh_int loads; /* load capacity (weight) */ sh_int health; /* hp */ }; struct ship_type_data { SHIP_VAL_DATA value; char *name; /* name of type of ship */ char *short_descr; /* short description */ sh_int skill_min; /* minimum skill in NAVIGATION required */ int vnum; /* vnum of the prototype */ int size; /* number of rooms */ }; struct ship_data { SHIP_DATA *next; /* next node in the global list */ SHIP_DATA *prev; /* prev node in the global list */ SHIP_DATA *next_in_room; /* next node in the room list */ SHIP_TYPE *type; /* type of ship */ CHAR_DATA *people; /* who's on the ship */ CHAR_DATA *helmperson; /* who's at the helm? */ ROOM_DATA *in_room; /* in which room is the ship */ ROOM_DATA *last_room; /* */ ROOM_DATA **rooms; /* array of ship rooms */ ROOM_DATA *storeroom; /* la stiva */ EVENT_DATA *action; /* event for action which takes time */ COURSE_DATA *course; /* for automatic sailing */ COURSE_STEP *cstep; /* current step in automatic sailing */ COORD_DATA *port; /* in which port ship is? */ AUTH_DATA *authorized; /* list of authorized ppl */ SHIP_VAL_DATA curr_val; /* current values */ SHIP_VAL_DATA max_val; /* standard values */ char *name; /* the name of the ship */ int vnum; /* vnum of the ship */ int direction; /* naviga verso... */ int flags; /* ship bitvector */ long idowner; /* player owner of the ship */ long idcaptain; /* player captain of the ship */ }; struct port_data { PORT_DATA *next; COORD_DATA *coord; char *name; }; struct course_step { COURSE_STEP *next; COURSE_STEP *prev; COORD_DATA coord; }; struct course_data { COURSE_DATA *next; /* next node in the global list */ COORD_DATA *port_orig; /* coords of starting port */ COORD_DATA *port_end; /* coords of destination port */ COURSE_STEP *first_step; /* first step out of the port */ COURSE_STEP *last_step; /* last step */ char *name; /* course name */ int vnum; /* course vnum */ }; #define FERRY_ZONE 5003 #define FERRY_WAIT 10 #define FERRY_SPEED 15 struct ferry_data { FERRY_DATA *next; /* next node in global list */ FERRY_DATA *prev; /* prev node in global list */ COORD_DATA *coord; /* loading coordinates */ CHAR_DATA *mob; /* the mob that control the ferry */ ROOM_DATA *room; /* ferry room */ ROOM_DATA *in_room; /* where it is */ EVENT_DATA *action; char place; /* in which site is? */ sh_int vnum; /* vnum of the ferry */ sh_int dir; /* direction from first to second site */ sh_int timer; /* minutes counter */ int cost; /* how much it charges to carry ppl */ }; /* ==================================================================== */ /* Goods */ /* ==================================================================== */ /* Global limits */ #define MAX_GOOD 200 #define MAX_MARKET 20 /* Types of goods */ #define TYPE_CORN 0 #define TYPE_FLOUR 1 #define TYPE_FABRIC 2 #define TYPE_HIDE 3 #define TYPE_DYE 4 #define TYPE_METAL 5 #define TYPE_ORE 6 #define TYPE_SPICE 7 #define TYPE_SUGAR 8 #define TYPE_OIL 9 #define TYPE_WOOD 10 #define MAX_TYPE_CODE 11 /* Types of TP */ #define TP_GCLOSE 0 #define TP_GSTRICT 1 #define TP_GLIMITED 2 #define TP_GFREE 3 #define NUM_TP_TYPES 4 /* Goods <--> Markets data */ struct market_good_data { sh_int total_tp; /* in how many tp the good is sold? */ sh_int good_appet; int qty; /* market's good quantity */ int price; float comm_prod; float demand; /* market's good demand */ float comm_closure; }; /* Types of good */ struct good_type_data { char *name; /* type of good */ int vnum; /* vnum of type */ int prod_avg[NUM_SEASONS]; /* minimal weekly seasonal production */ int elasticity; float cons_speed; /* market's good consumption speed */ }; /* Goods data */ struct good_data { GOOD_TYPE *gtype; /* type of good */ char *name; /* good name */ char *unit; /* good unit of measurement */ char *short_descr; /* good unit + good name */ sh_int code; /* which type of good is */ sh_int weight; /* how much one unit weight */ sh_int life; /* how much it last */ sh_int docg; /* 1 stop osmotic production */ int cost; /* how much one unit cost */ int vnum; /* good vnum */ int mkvnum; /* source market vnum */ int quality; /* for production code (act.works.c) */ }; /* Goods in TP data */ struct trp_good_data { TRP_GOOD *next; /* next node in tp goods list */ TRP_GOOD *prev; /* prev node in tp goods list */ int goods_vnum; /* vnum of the goods */ int quantity; /* how many available */ int prev_qty; /* qty prev last reset */ int stock; /* has this goods at stock? */ }; /* Trading Posts data */ struct trading_post_data { TRADING_POST *next; /* next node in global list */ TRADING_POST *prev; /* prev node in global list */ TRADING_POST *next_in_market; /* next node in market list */ MARKET_DATA *market; /* pointer to market area */ TRP_GOOD *first_tpgood; /* first good in tp list */ TRP_GOOD *last_tpgood; /* last good in tp list */ ROOM_DATA *in_room; /* in which room is placed? */ int vnum; /* vnum of the trading post */ int type; /* type of trading post (see TP_Gxxxx) */ }; /* Values for markets */ struct market_vars { float prod_var; float price_var; float closure_var; }; #define MKT_EXTRA_PROD (1 << 0) #define MKT_MALUS_PROD (1 << 1) #define MKT_EXTRA_PRICE (1 << 2) #define MKT_MALUS_PRICE (1 << 3) #define MKT_PESTILENCE (1 << 4) #define MKT_INSECT (1 << 5) #define MKT_DROUGHT (1 << 6) #define MKT_FLOOD (1 << 7) #define MKT_WAR (1 << 8) #define MOD_PROD 1 #define MOD_PRICE 2 #define MOD_CLOSURE 3 struct market_affections { MARKET_AFF *next; sh_int duration; /* For how long its effects will last */ sh_int what; /* which value modifies */ float modifier; /* value modifier */ long bitvector; /* Tells which bits to set (MKT_XXX) */ }; /* Markets data */ struct market_data { MARKET_DATA *next; /* next node in global list */ MARKET_DATA *prev; /* prev node in global list */ TRADING_POST *tp_list; /* list of trading posts */ MARKET_AFF *affect; /* list of affections */ COORD_DATA heart; /* "virtual" tp, market center */ MARKET_VARS var_real; MARKET_VARS var_mod; char *name; /* name of the market */ int vnum; /* vnum of the market */ int size; /* how big the market is? (radius) */ int num_of_tp; /* how many tp this market has? */ int affections; /* bitvector of affections */ };