Storms of Times _________ __ __,----' `-----.__ __ \\/====-____ ___,-' ` \\ _/_/_/ /||\\ `---.____/ ______---\ _- / \/ ||| \\ _,'` __,--' ,--'||\-_ /,--_/--.|- |`\. \\ ,' _,' ,-' | \\`. ` */ /==/- / || `\. / .' ,' | \\ \_** /==/- / || \ / / _____ / __ | \\**-_/==/|- _/ ,// \ / ,-' `-|--' `--_ \ ***-/===| \-_-===-' _ _/` `-| **** *|====| \_ __,-- ' .. '* *** *|====| \_ _, /\ ... *** * \=====\__ \/ \__ _ ... ***-' _/'\=,-' ____-'`-_ `== \ () *. ()| ** //--\ ///--\`._ `- _\ \ #_/ /#_| () / \=======\ `----.________,--- __/ # / # /#_/ __--======`) \-._______________,--- ### / \ / # | //,--' `==--___ |-------' ##### / / / \ O##<_ //,-- -\ / / \ Mud20 ver 1.0 (Updated by Todd H. Johnson 12/2007) ============================================================================== Word from the Mud20 Team: This document has been considerably updated from its original content for both Mortal Realms, and its descendant, Emud. While there are significant changes in the code of Mud20, to where it looks very little like the inner workings of either of its predecessors, the basics of building an area are the same, and entries have been added or updated where necessary. Word from me (Scandum) This document was originally written by Chaos and Order for Mortal Realms. Emud, a clone of mortal realms, is still for 80% compatible with the source this document was written for. So except for a couple of changes this guide is an exact duplicate of the MrMud 1.4 builder document. It should be significantly accurater than the original version though. (At least, so I hope) Greetings future area creator! We (Chaos and me, Order) have put together this collection of documents as both references and instructions to building areas. Below is a list of the documents in the order which we recommend reading, along with a brief description of each. diku_bld.txt The official handbook for creating Diku areas as created by the Curious Area Workshop, it is included in the Emud Area Package because it does a decent job of describing all of the basics of area building. This document has been modified to Mud20 specifications. mob_prog.txt The instruction document that describes how to implement mob programs. This does NOT describe how to make special programs in C for mobiles, but details the functions and triggers used in programming mobiles from the area file. This is the only method of support that can be given to creators for making mobiles do special functions. mud20.txt the latest set of values used by Mud20. Updates to this document set will be contained in this file and the online builder help file. spells.txt the list of spells and the numbers necessary for specifying the spells in creating scrolls, potions, pills, scrolls staffs, wands and mobile progs. ============================================================================== Emud now uses OLC which is short for Online Creation. This means you can create your entire area online using a build char on the test mud. If you wish you can skip most sections, and only pay attention to the part describing object and mobile programs. If you want more information you can read it all, it might come in handy when you know what you're doing, and should make using the OLC engine a little easier. Also there is a help file online on the test mud, type: help builder, and you will enter it. ============================================================================== diku_bld.txt The Builder's Handbook (version 1.0) By Builder_5 (of the Curious Area Workshop) (Modified by Scandum on 9/12/01) TABLE OF CONTENTS 1. Overview 2. Terminology 3. Basics 4. The #AREA, #HELPS, and #ROOMS section 5. The #MOBILES section 6. The #OBJECTS section 7. The #SHOPS section 8. The #RESETS section 9. Putting it all together 10. Credits 1. Overview This document is meant to be a basic tutorial to building areas for Emud. Readers of this Handbook should have at least have some experience with Emud or Diku muds, and will understand the basic concepts of armor, levels, and the et cetera. Nowadays, many mud-admins express the wish to have an entirely unique world. Unfortunately, building is time consuming and requires no mean amount of skill, with the added 'bonus' of being hard to learn; the standard mud-docs that get bandied about are somewhat vague on certain subjects, and were originally intended as a reference guide rather than a learning document. I hope to make this Handbook a 'cookbook' of sorts -- an explanation of the how's and what's of building a Emud based area for the non-coding inclined. This document is a tutorial for building in the standard Emud release 2.2. Most (95% or so) muds have changed or added to the information, but still follow the basic format. Reading this document should prepare you for most Diku muds you will encounter out on the net. The Curious Area Workshops highly recommends that every builder understands the nuts and bolts of building, even if they have access to one of the mud-area editors available out there. Being able to build with an editor is nice, but the knowledge of how the nuts and bolts of building actually works is of great value when things go wrong. We cannot emphasize this enough, but we will attempt to refrain from preaching it in the rest of this document. 2. Terminology Here are some common terms used in builing, and this handbook: Desc: Short for 'description'. Db: Database. The files that make up the 'world' of a mud. Flag: A bit-vector that tells the mud that a particular monster, object, or room has a certain quality. Mob: Mobile. A monster. Obj: Object. Tilde: This is a tilde: ~ . It signifies the end of a line or a field in some of the database files. Vnum: An object, monster, or room's unique identification number. Stands for 'Virtual Number'. Zone: Used synonimously with 'area'. 3. Basics For all examples, the area under creation will be known as 'handbook' or 'example area'. It is assumed that the builder has access to some standard type of text editor and knows how to use it. *** FILES For each area, one file must be created for inclusion into the dikumud's db: handbook.are This file includes the various sections of: #AREA #HELPS #MOBILES #OBJECTS #ROOMS #SHOPS #RESETS *** FLAGS Simply put, a flag tells the mud that there is something 'special' about a mob, room, or object. In the sections below, lists of flags will be given with a number, a bitvector, next to it. For example, here is the sample of room flags that will appear below in the #ROOMS section: ROOM_DARK 1 ROOM_NO_MOB 4 ROOM_INDOORS 8 ROOM_PRIVATE 512 ROOM_SAFE 1024 ROOM_SOLITARY 2048 ROOM_PET_SHOP 4096 ROOM_NO_RECALL 8192 Now, for example, you are building a room. Deciding that this room is a small section of tunnel, you would choose the flags: DARK (1) and INDOORS (8) These numbers are the important part. When the mud looks at the .wld file, it looks for _one_ number in a certain particular spot for each room's flags. Therefore, to give one room _two_ flags, you ADD the bitvectors together and place that number in the flags spot of that room's data. Thus for this example: INDOORS + DARK = 9 Another simple format can be each number separated by a '|' symbol. The '|' symbol is an logic OR symbol. INDOORS + DARK = 1|8 The final format is to use the names of the flags in replace of the numbers. This system is MUCH easier to read, but may not be compatible with some of the mud-editors. INDOORS + DARK = ROOM_INDOORS|ROOM_DARK How does this work, though? The bitvectors are in binary...the number you arrived at when you added can only be reached by one combination of adding those numbers together (you're not allowed to use a flag or number more than once). Thus, if your number was: 524 you would know that it was PRIVATE (512) (the highest number that will go into 522) 522-512 = 10 INDOORS (8) is the next highest number that will go into it. 10-8 = 2 NO_MOB (2) is the last one: 2-2 = 0 (no more flags). It should be obvious that the list is not complete. The blank spots are flags the are not used but exist for backward compatiblity. PLEASE do not use any of these. The game may use some of them for temporary values, and their use may jeopardize the system. *** Zone Number Each area must have its own unique number. Usually, the admin of your particular mud will assign this to you. This number is used as part of all your area's virtual numbers. (see below). The system that nearly all mud administrators like is the QQ format. This system places the symbols 'QQ' in replace of any zone number. The administrators will later assign a number in replace of the QQs. *** Virtual Numbers Every Mob, Obj and Room must have its own Virtual Number for the mud to identify it with. Each number must be unique among its own type. For example, If I made the Sword of Cheezy Destruction, I may decide to make it item number 2200 of my zone. The first two digits are the zone number (above) of my area, the second two identify which item it is in that area. These first two numbers will be assigned by the system administrators. The first two numbers should be replaced by 'QQ'. Therefore the format you would write for the item number is QQ00. However, I can have a mobile with number 2200 as well. A room #2200 too. The number must be unique among all others of its type (rooms, objs, mobs) But does not need to be unique in regards to other types of db's. Emud admins do not allow using any object or mobile that does not solely exist in the zone of the creator, unless they are special objects provided for resets in all areas of the game. If such is available you will be given such a list separately. So all referenced objects or mobiles should start with the QQs. If your area has more than 100 rooms then continue using the 'QQ' method, but change the value to 'QR' for rooms 100-199, and 'QS' for rooms 200-299, etc... *** Strings A string holds the actual data of the text sent to the player, such as a mobile's name, or a room description. Strings can range in size from zero length to the MAX_STRING_LENGTH. Emud systems are 20,000 bytes allowed per string in a description, and 2,000 for names and short descriptions. All strings end in the tilde '~' symbol. Placing a return after the text, but before the tilde will display the return to the player. Custom color may be added to certain strings. Room descriptions, mobiles descriptions, object descriptions, and extra descriptions may all have custom color. Adding color is as simple as adding a pair of matching brackets, with three digits between them. The three numbers are the parameters of the color change request. Format: '{abc}' with a,b,c being parameters. Parameter 'a': VT102 code. 0 - Dim 1 - Bold 3 - Restore color to text default regardless of b,c 4 - Reverse 5 - Underline 7 - Flashing (All VT102 systems support Dim, Bold, and Restore) Parameter 'b': Foreground color Parameter 'c': Background color 0 - Black 1 - Red 2 - Green 3 - Yellow 4 - Blue 5 - Purple 6 - Cyan 7 - White Example: The small {130}dog{300} sits by the {114}cat{300}.~ This example starts with normal colors. 'dog' is bold, yellow on black. The 'cat.' ends up being blue background, with red text. (be aware to reset after using a background color like in the example) 4.1 The #AREA section The #AREA section has very few lines but sets up the entire file. *** Area Name #AREA <area name>~ example: #AREA Sanitorium~ *** Author Name #AUTHORS <author names>~ example: #AUTHORS Gregorius~ *** Version Number This should be kept to the current version number of the running game for all newly created areas; it is to ensure that major changes in the code will allow for older areas to remain backward compatible. As of this writing, the current area version is 4. #VERSION 4~ *** Reset Message This message will echo through the area every repop. #RESETMSG <reset message>~ example: #RESETMSG <You hear the patter of little feet.~ *** Level Range This is a very arbitrary set of numbers that the creator must decide on. This field must contain exactly 4 numbers between 0 and 99 #RANGES <low_soft> <hi_soft> <low_hard> <hi_hard> Example: #RANGES 40 60 1 95 *** Temperature (optional) This is the daily temperature scale in Fahrenheit. The winter and summer lows are for night temperature, with the daily adding to it. To reverse the seasons, simply switch out winter and summer temps. The 'Wetness Scale' is a number from 0 to 10. 0 is a desert. 10 is a tropical rain forest. 5 is the default value. Leaving this optional parameter off uses defualt settings for weather. #TEMPERATURE <winter low> <summer low> <daily change> <wetness scale> Example #TEMPRATURE 0 80 20 4 *** Flags (optional) These flags count for the entire area. Mud20 added population flags that should be used for all civilized area files. The presence or absence of these flags determines the availability to use certain skills or not. #FLAGS <area flags> example: #FLAGS AFLAG_NORECALL|AFLAG_NOTELEPORT|AFLAG_NORIP example: #FLAGS AFLAG_NOCASTLE|AFLAG_NOGOHOME|AFLAG_NODEBUG AFLAG_NODEBUG Use this flag if you have rooms that are non-standard. Usually this flag is not necessary. A non-standard room is one where when you leave room A north to room B. Then you leave room B south. While trying to get to A, you actually end up at room C. AFLAG_NOTELEPORT This stops a player from teleporting or rifting into the area. AFLAG_NORECALL This stops a player from being able to use the recall spell in the area. AFLAG_NORIP This stops a player from being able to cast the rip spell in the area. AFLAG_NOCASTLE This stops a player from being able to build a castle in the area. AFLAG_NOGOHOME This stops a player from being able to use the gohome command in the area. AFLAG_WEATHER Enables use of advanced weather settings for an area. See entry for the #WEATHER header. AFLAG_VILLAGE|AFLAG_TOWN|AFLAG_CITY|AFLAG_METROPOLIS These flags are used in population center areas to determine the number of inhabitants of the area ICly. You can NOT use more than one population flag in your area flags. * Villages are small areas with 50-200 inhabitants. * Towns are larger than villages, up to around 5,000 people. * Cities are bustling population centers, larger than towns. * Metropolis' are mega cities of ancient times, half a million or more. If your area is wilderness, or has less population than this, a single family, etc, then do not use any of the above flags. *** Justice System This determines the crime and punishment for a given player in your are when he falls afoul of the local law. Note that there does not have to be a formal legal system ICly in the area, merely that certain mobiles will execute certain actions if a player commits certain violations upon their fellows. Example: #JUSTICE Courtroom <room vnum> Dungeon <room vnum> Judge <judge vnum> Guard <guard vnum> Crime CRIME_HIGH_MURDER PUNISHMENT_DEATH Crime CRIME_ASSAULT PUNISHMENT_SEVER Crime CRIME_MUGGING PUNISHMENT_SEVER -1 The headers for the justice system are as follows: Courtroom: The vnum of the room where the judge presides Dungeon: The vnum of the room where players are interred for jail time. Judge: Mobile vnum of the Judge who assigns bounties, jails and releases. Guard: Mobile vnum that carries out judgements, arrests, executions. Crime: Sets the punishment for each type of crime in the area, from: CRIME_MUGGING stealing from a mobile CRIME_ASSAULT attacking a citizen of the area (flagged ACT_CITIZEN) CRIME_LOW_MURDER killing a mobile resident of the city CRIME_HIGH_MURDER killing another player character in the area NOTE that in order to receive punishment, you must be caught in the act by either a citizen of the area, or a guard. The penalties for each crime can be your choice of: PUNISHMENT_NOT_ENFORCED No punishment is given PUNISHMENT_RANDOM_ITEM Guard mobile confiscates a random item. PUNISHMENT_SEVER Guard mobile severs a limb as punishment. PUNISHMENT_JAIL Player is taken to judge, who places player in jail. PUNISHMENT_DEATH Player is attacked on site by guards, until killed. NOTE that the justice entry has to end with a -1. Failure to add this end flag will crash the mud. 4.2 The #HELPS section This section allows the addition of new help listings. Entire help menus may be created. Begin this section with: #HELPS End this section with: 0 $~ *** Help Archetype <level> <name list>~ <text of help and special menu pointers> ~ example: 5 SWORD CUTLASS "LONG SWORD"~ {300} The sword is a very strong weapon But you may find stronger ones. {120}(A) {050}Information on Knives {120}(B) {050}Information on Spoons {120}(-) {050}Return {a}knife {b}spoon {-}cuttlery ~ *** Level This is the level the player must be to be able to read this help. Use 0 if you wish everyone to read it. *** Name List This field is a list of keywords that will reference the help text. These may be odd encoded numbers for menu use only, or simple ones that the player may enter help on directly. This field should be in all capital letters. Use " " to cluster multiple words for a search string. *** Body The body has several special encoded features. The first is that all initial spaces and returns are removed unless the body start with a '.' a color code works just as well though. *** Menus The menu stucture shown above has two sections. The first section, where the options are surrounded by '(' and ')' is the display section. The display section is shown with the rest of the body text. The actual decoded menu section is a line that starts with '{'. Once a menu option is trapped, the following letter is the option that the user must pick, followed by '}'. The following letters are what the menu item will reference in the help system. These menu items may point to any other item in the help db. Please use only lower case letters for the menu system, since this feature is case sensitive, and most people select menus by lower case. 4.3 The #ROOMS section The #ROOMS section contains all the information necessary for the mud to make all the rooms of your area, link the exits together, and all the other little things concerned with the 'where's' of an area. The file simply consists of all the rooms in sequential order by their virtual number. Here is a sample room for this section's example: This section in the .are file will always start first with this line: #ROOMS This section in the .are file will always end with with this line: #0 *** ROOM ARCHETYPE (the <'s and >'s are used to offset values, and should be ignored) <#vnum> <room name>~ <room description>~ <area number> <room flags> <sector type> <room width> <room depth> <room height> F <vnum to fall to> <slope of cliff> <amount of feet> E <extra name list>~ <extra description>~ D<exit direction> <exit description>~ <door name>~ <door flags> <key number> <vnum of connect room> <exit size> S ---example follows this line--- #QQ00 The First Room~ You are standing in the first room of this area. Many rooms are sure to follow, soon to be chock-filled with adventure, danger, romance, and Giant Green Photosynthetic Death Gerbils from Morovia. There is a sign hanging from the east wall here, and a large steel grate bars the way to the north. ~ QQ ROOM_INDOORS|ROOM_NO_MOB SECT_INSIDE 20 30 30 DDIR_NORTH You spot the Second Room to the north, behind a large steel grate.~ grate steel~ 1 QQ00 QQ01 SIZE_NONE E sign~ The sign says: WELCOME TO THE FIRST ROOM! ~ S ---example precedes this line--- Now to explain what each part means, line by line: #QQ00 The virtual number of this room: Totally unique, no other room in the db will have this number after the adminstrators assign a value for the QQ. The First Room~ room name: the 'title' of the room. This is typically not more than 5-6 words long. Note the tilde marking the end of this field. You are standing .. the way to the north. ~ room description: This is what a player sees if he or she types 'look' in that room. What is in this section is up to your own, personal taste. More about the various description types can be found below. Note the tilde marking the end of this field. Advise: Try to describe the room without telling the one reading it how they feel. Imagine yourself playing a vampire who according to the area creator: You feel shivers running down your spine as you see blood dripping down the wall. -or the other way around- You start to drool as you see delicous sparkling red blood dripping down the wall. Another advise would be not to describe the area as if the person walks through it from room A to Z, Venturing through some areas from room Z to A one gets the feeling they're walking backwards. as in: Before you leads a hallway northwards (while you just came in from the north) QQ ROOM_INDOORS SECT_INSIDE 20 30 30 The first number is the owner of the room, used for spells that create a room, this is the pvnum of the caster. IT SHOULD NEVER BE USED in area coding. The second number is the room flag value. Please see 'flags' in section 3 of this handbook, and Room Flags below. The Third number is the sector type. Please see 'sector types' below. Be aware the mud translates these flags to bitvectors, Mud20 prefers their builders to use these flags instead of numbers. You can however use numbers, since it only takes a couple of seconds to convert them to flags with the proper tool. The last set of numbers is the width, depth and height of the room in feet. Hence, this room is 20 feet wide, 30 feet deep, with a 30-foot ceiling. Leaving these values as 0 makes them use the room default of 30 feet square (with a 15 foot ceiling if flagged indoors). NOTE: As of version 1.0, room dimensions are not yet used in hard code. DDIR_NORTH An exit to direction north. The section on 'Exits' below will shed more light on this subject. You spot the Second Room ... Exit description: What a player would see if they typed 'look north'. Note the tilde marking the end of this field. grate steel~ door name: What words can be used to manipulate the door. These two words can be used in conjunction with open, close, pick, and look commands, etc. 1 QQ00 QQ01 SIZE_NONE The first number is the door flag, 1 being: is_door This and the other numbers will be explained more fully under 'Exits' below. The second number is the key number. the virtual number of the object that can be used to lock or unlock this door. The third number is the vnum of what room this exit leads to. The final value is the SIZE_ flag, to determine what the maximum size of creature who could pass through the exit is, based on standard d20 size categories: SIZE_NONE = no restriction SIZE_FINE SIZE_DIMINUTIVE SIZE_TINY SIZE_SMALL SIZE_MEDIUM SIZE_LARGE SIZE_HUGE SIZE_GARGANTUAN SIZE_COLOSSAL Note that certain race types, and certain skills (escape artist, for example) and certain spells (pass door, gaseous form, etc) can allow a character to still bypass this setting. E Tells the mud there is an extra description coming. sign~ extra name list: The words that can be used to look at the extra description. (i.e. 'look sign') Note the tilde ending the field. The sign says:... The text of the extra description. Again, note the placement of the tilde. S End-of-Room character. Each room should end with one of these. Now, for more explanations... *** DESCRIPTIONS Descriptions are fairly self explanatory. - Short Descriptions These are the short descriptions a player can see. They should be kept to half a line long. The short description of a room is mostly called: room name - Descriptions These are the multi-line descriptions of rooms. When creating a description keep in mind to keep each line under 80 characters unless you use color codes. Clues to the Extra Descriptions should be included in the room description, if not elsewhere. - Extra Descriptions An extra description, of which there can be many for each room, is something else specific to look at, not normally seen just by typing look, or entering the room. An extra desc is started by an E (a seperate E for each extra desc in the room), followed by the keywords that can be used to look at this description on the next line, each separated by a space, followed by a tilde. Then, the description itself, followed by a tilde. E keywords~ You spot the keywords. They look important! ~ *** ROOM FLAGS Please consult the section on flags in section 3 for how bitvectors are added and used. Briefly, add each flag that you want for a particular room. Seperate them with the | (pipe) symbol. ROOM_NONE 0 ROOM_DARK BV01 Requires light source, no matter what time. ROOM_FOG BV02 Spell affect, grants partial concealment. ROOM_NO_MOB BV03 Mobiles cannot wander into room. ROOM_INDOORS BV04 Has ceiling, no weather affects. ROOM_BLACKLIGHT BV05 Spell affect, impervious to darkvision. ROOM_NO_ASTRAL BV06 Cannot teleport in/out. ROOM_CLANSTOREROOM BV07 Room contents save. Only use with admin approval. ROOM_ALTAR BV08 No longer used ROOM_NO_MAGIC BV09 Spells cannot be cast, affects are dispelled. ROOM_PRIVATE BV10 Only two people allowed in room. ROOM_SAFE BV11 No aggressive actions allowed. ROOM_SOLITARY BV12 Only one person allowed in room. ROOM_PET_SHOP BV13 Uses per shop code, sells mobile from room vnum +1. ROOM_NO_RECALL BV14 Cannot recall from room. ROOM_RIP BV15 Spell affect, internal use ONLY. ROOM_BLOCK BV16 Spell affect, exits are blocked from normal passage. ROOM_NO_SAVE BV17 Hard code use only. DO NOT USE. ROOM_MORGUE BV18 Allows lowbie players to retrieve corpse for a price. ROOM_INN BV19 "Safe" room allows recovery faster and offline. ROOM_IS_CASTLE BV27 Internal use for dwelling creation engine. ROOM_IS_ENTRANCE BV28 Internal use for dwelling creation engine. ROOM_NOTE_BOARD BV29 Room has a not board for posting. ROOM_NO_CASTLE BV30 Cannot buy a dwelling here. ROOM_NO_RIP BV31 Cannot use spells to create a virtual room here. ROOM_MAZE BV32 Randomizes exits, very confusing. ROOM_ICE BV33 Spell affect, movement/combat require balance check. ROOM_DYNAMIC BV34 Uses dynamic descriptions. NOT FULLY IMPLEMENTED. ROOM_WILDERNESS BV35 Room is a wilderness room. NOT FULLY IMPLEMENTED. ROOM_HASH BV36 Internal use only. DO NOT USE. ROOM_NOT_VALID BV37 Internal use only. DO NOT USE. These are complete as of Mud20 v1.0. *** SECTOR TYPES The 'sector type' of a room controls how many movement points it costs to enter that room. It may also require other skills SECT_INSIDE 0 SECT_CITY 1 SECT_FIELD 2 Can build dwelling here SECT_FOREST 3 Can build dwelling here SECT_HILLS 4 Can build dwelling here SECT_MOUNTAIN 5 Can build dwelling here SECT_LAKE 6 Deep water requires swim check. SECT_RIVER 7 Shallow water can be waded. SECT_OCEAN 8 Deep, turbulent water requires swim check w/penalty. SECT_AIR 9 Requires flying/incorporeal to travel, obj/mobs fall. SECT_DESERT 10 Characters take nonlethal heat damage *NOT YET IMPLEMENTED* SECT_LAVA 11 Burns characters not resistant to fire. SECT_ETHEREAL 12 Must be ethereal to travel. SECT_ASTRAL 13 Must be astral to travel. SECT_UNDER_WATER 14 Swim check/water breathing required. SECT_UNDER_GROUND 15 SECT_DEEP_EARTH 16 SECT_ROAD 17 SECT_SWAMP 18 SECT_BEACH 19 SECT_TUNDRA 20 Characters take nonlethal cold damage *NOT YET IMPLEMENTED* SECT_EDGE 21 DO NOT USE *** EXITS Exits use the letter D and a number, compass, rather than the letter abbreviations that most mudders are used to for compass directions. Hence: (north) 0 4 (up) | / (west) 3-+-1 (east) + | / 2 5 (down) (south) DIR_NORTH 0 DIR_EAST 1 DIR_SOUTH 2 DIR_WEST 3 DIR_UP 4 DIR_DOWN 5 Most muds use: D4 but DDIR_UP to make an upward direction works too for this mud. Each exit starts with its own direction field, and contains an exit description and door keyword list, (both of which can be left blank with a tilde), and a fourth line containing a door type, key number, and exit-to-room number. Rooms without exits need no direction fields and the etc...this section may be safely ignored. The exit description is used for when a player types look <direction>. This should in most cases be a description of the exit, and is followed by a tilde on a line by itself. Each exit starts with its own direction field, and contains a door keyword list and The next field is the door keyword list, used for manipulative door actions, such as open, close, pick, etc. These words are separated by a space, and are followed by a tilde on the same line. It is best to use the keywords as a phrase that makes sense, for the echo when the exit is manipulated, like the keywords "big iron door" will yield the echo "Bilbo opens the big iron door." The door type can be the following values: 0 standard hallway without door EX_ISDOOR BV01 exit has an open door EX_CLOSED BV02 door is closed EX_LOCKED BV03 does not necessarily require a key EX_HIDDEN BV04 cannot be seen without detect hidden or searching EX_RIP BV05 internal use, DO NOT USE EX_PICKPROOF BV06 cannot be picked EX_BASHPROOF BV07 cannot be bashed open EX_MAGIC_PROOF BV08 cannot be magically unlocked EX_BASHED BV09 DO NOT USE EX_CLIMB BV10 requires climb check to scale. EX_FLY BV11 sheer or no walls, must fly to enter. EX_BARRED BV12 physically barred door, penalty to bash. EX_PASSPROOF BV13 cannot be entered with pass door/incorporaeal. EX_MAGICAL_LOCK BV14 spell affect cannot pick, penalty to bash. EX_EASY_PICK BV15 DC to pick is 5 points less. EX_HARD_PICK BV16 DC to pick is 5 points harder. EX_AMAZING_PICK BV17 DC to pick is 15 points harder. EX_WEAK_DOOR BV18 thin/weak door 13 DC to break down (15 with no flag). EX_HEAVY_DOOR BV19 door is 23 DC to break down. EX_IRON_DOOR BV20 door is 28 DC to break down The key number is simply the vnum of the key that can open the door. A door without a keyhole is represented by a -1 in this spot. The exit-to-room number is the vnum of the room where the exit leads to. Use the QQ system here. If the room connects to an outside room leave a ZZZZ here, with an extra description of where the room should connect. Try to make geographical correct outside connections. *** Falls - For Air and Cliffs Rooms that characters may fall from have a section designated with the letter 'F'. This is followed by the room that they fall into, and the distance of the fall. F <room to fall into> <slope of cliff> <distance of fall in feet> This modifier for a room takes into play the skill of CLIMB and flying. The only special case is where the sector type is SECT_AIR. This special case will check to see if the character is flying, or immediately damage them. All other sector types are considered cliffs, and will check both dexterity and the climb skill. When a player falls, two things happen. They are damaged by the amount defined by an equation based on how many feet the fall was. And they are transfered to the room pointed to by the "room to fall into" field. An area creator can use this to make a dangerous section for players to cross, such as a path up a mountain. This gives them a chance to fall back down the path. The SECT_AIR is quite dangerous, in that losing fly causes an instant fall. A trick that can be used to simulate a rocky terrain is to have a fall of a few feet, and make the fall room point to itself. Be aware that more creative tumbles can be created with a mobile program. *** TIPS and OBSERVATIONS Make a master plan before you start building, that might prevent having to delete or rewrite several parts of your area. For a working door, the rooms on each side must have matching doors and doorflags. Also the #RESETS section must have the associated close door command to close, lock, or reopen the door every repop. 5. The #MOBILES section The #MOBILES section contains everything the mud needs to know about the mobs, except for where they are and what they're holding. Each mob in the file is in sequential vnum order. Mobiles may also contain some form of mob_prog. These programs make the mobile appear more life-like, and can be used to set up puzzles or quests. Mob_progs allowing a quest are a "must" for every Mud20 area. Mob_progs are described later in this text. This section in the .are file will always start first with this line: #MOBILES This section in the .are file will always end with with this line: #0 *** ARCHETYPE MOB (simple) <#vnum> <name list>~ <short description>~ <long description>~ <description>~ U <level> <class> <race> <sex> <position> <deity> <actions> <affects> <natural armor> <deflection armor> <hit dice> <damage dice> <alignment> <ethos> <gold> <STR DEX CON INT WIS CHA> <body part> <attack part> <size> 0 0 0 0 0 0 0 [C <multiclass name> <multiclass level>] [mob program] Here's a sample mob: ---example follows this line--- #QQ00 mob example~ the Example Mob~ An example mob stands here, completely clueless.~ The example mob looks indistinct, as if it hasn't been completely fleshed out yet. ~ U 18 CLASS_FIGHTER RACE_ELF SEX_MALE POS_STANDING GOD_NEUTRAL ACT_RACE|ACT_WIMPY|ACT_RACE AFF_DETECT_INVIS 5 0 d8+10 1d2+1 0 0 10 13 13 13 13 13 13 BODY_NONE BODY_NONE SIZE_MEDIUM 0 0 0 0 0 0 0 C CLASS_FIGHTER 12 C CLASS_WIZARD 6 ---example precedes this line--- Now, to explain, line-by-line: #QQ00 The vnum of the mob. Read the section on Virtual Numbers in part 3 of this document for more information. mob example~ The namelist of this mob: what words can be used to interact with this mob. For instance, 'kill mob' or 'kill example' would both be valid for this mob. Note the tilde following the field. the Example Mob~ The short desc of the mob. Used in messages such as: "You poke the Example Mob." "the Example Mob pounds you!" This is the last time we'll note the tilde following the description. An example mob stands... ~ The long desc of the mob. Used as part of a room description when a player enters or looks in a room. The example mobs looks... ~ This is the description of the mob; what a player sees when typing: 'look' at the mob. U 18 CLASS_MONSTER RACE_NONE SEX_MALE POS_STANDING GOD_NEUTRAL The 'U' stands for unique mob. This feature is not used in Mud20 presently, and is left there as a placeholder. Always use a 'U' here. The first number is the level of the mob, or hit dice. The second value is the CLASS of the mobile. If it is not flagged ACT_CLASS, this value is ignored, and saved to CLASS_MONSTER. In this case, the level is purely the HIT DICE of the mobile. NOTE that in order for class levels to count, you also need to set the mobile's MCLASS level (preceded with a 'C' flag, below.) The third value is the RACE of the mobile. if the mobile is not flagged ACT_RACE, this value is ignored. Otherwise, several racial characteristics are determined by the race and racial type of the mobile. The fourth value is the gender of the mobile. The fifth value is the position of the mobile at reset. The sixth value is the deity of the mobile. This determines several things based on the faith of players that interact with the mobile. ACT_RACE|ACT_WIMPY|ACT_RACE AFF_DETECT_INVIS The first line is the ACTION flags, which determine certain behaviours and actions of the mobile. The second line is the AFFECT flag, which tells the mud about any special abilities the mob might have. Both these flag values work as per the section 'FLAGS' in part 3 of this handbook. See 'ACTION & AFFECT FLAGS' below for more on both of these. 5 0 These are armor class fields for nonstandard mobiles. Mobiles will use the armor settings for their race by default if flagged ACT_RACE. The first value is the natural armor bonus, the second is the deflection bonus. Note that this does not reflect actual armor of the type that is worn. If you want your mobile to wear armor, you need to equip it in resets with the proper objects. d8+10 1d2+1 0 0 10 The first field is the mobs hit dice. There is more on Hitpoints and damage below in the aptly named 'HITPOINTS and DAMAGE'. The second field is how much damage a mob does with its bare hands in dice. The third field is the alignment of the mobile, from good(1000) to evil(-1000). The fourth field is the mobile's ethos, from lawful(1000) to chaotic(-1000). The fifth field is how much money the mobile carries in copper. 13 13 13 13 13 13 This is the abilities of the mobile, in the following order: STR, DEX, CON, INT, WIS, CHA BODY_NONE BODY_NONE SIZE_MEDIUM 0 0 The first value is the body parts a mobile possesses if it is flagged ACT_BODY. This value is overridden if the mobile is flagged ACT_RACE, it is used for generic nonstandard race mobiles. The second value is the body parts a mobile attacks with if it is not flagged ACT_RACE. This value is overridden if the mobile is flagged ACT_RACE, it is used for generic nonstandard race mobiles. The third value is the size of the mobile, based on standard size categories in the D20 SRD: SIZE_FINE SIZE_DIMINUTIVE SIZE_TINY SIZE_SMALL SIZE_MEDIUM SIZE_LARGE SIZE_HUGE SIZE_GARGANTUAN SIZE_COLOSSAL This setting overrides the racial default for mobiles flagged ACT_RACE, to allow for nonstandard sized creatures (giant bears, miniature giant space hamsters, etc.) C CLASS_FIGHTER 24 These are the classes of a mobile flagged ACT_CLASS. This can be as many classes as is reasonable, so long as the total level of classes does not exceed the level of the mobile. Note that a mobile flagged ACT_CLASS has its hit points determined from its classes first, rather than its hit die field. The total number of class levels does not have to add up to the mobile level, any additional mobile levels are considered monster hit dice, and determine the remaining hit points based on the hit die field. The multiclass flags use the same class flags as the class field above: class flags CLASS_BARBARIAN 0 CLASS_BARD 1 CLASS_CLERIC 2 CLASS_DRUID 3 CLASS_FIGHTER 4 CLASS_MONK 5 CLASS_PALADIN 6 CLASS_RANGER 7 CLASS_ROGUE 8 CLASS_SORCERER 9 CLASS_WIZARD 10 CLASS_ADEPT 11 CLASS_NOBLE 12 CLASS_COMMONER 13 CLASS_EXPERT 14 CLASS_WARRIOR 15 CLASS_ARCANE_ARCHER 16 CLASS_ARCANE_BLADE 17 CLASS_ASSASSIN 18 CLASS_BLACKGUARD 19 CLASS_DUELIST 20 CLASS_DWARVEN_DEFENDER 21 CLASS_ELDRITCH_KNIGHT 22 CLASS_LOREMASTER 23 CLASS_MYSTIC_THEURGE 24 CLASS_SHADOWDANCER 25 CLASS_MONSTER 99 The rest of the fields in the mobile entry are not currently utilized, merely there to make for easy addition of fields in future revisions without the need to address changes in the room layout. *** DESCRIPTIONS Descriptions are done much the same way as those in the section in 'Rooms', earlier in this handbook. The reader is encouraged to go back and reread that section if necessary. However, the placement of tilde's is still very important. - Name list~ name of the mobile - Short description~ shown when interacting with the mobile - Long description~ shown when typing 'look' in the room the mob stands. - Description~ shown when you look at the mobile. *** ACTION & AFFECTION FLAGS Action flags tell the mud how a mob behaves, and affection flags control the special qualities of a mob. These flags are added together as described in 'FLAGS', in part 3 of this handbook. Remeber that the flags can be referenced as the flag name itself. Below is a listing of flags for each type, with descriptions of what each does: Action Flags ACT_STAY_AREA BV01 /* Stays in the Area it resets */ ACT_SENTINEL BV02 /* Stays in one room */ ACT_SCAVENGER BV03 /* Picks up objects */ ACT_DRUNK BV04 /* is drunk and talks so */ ACT_MOUNTABLE BV05 /* Can be mounted */ ACT_AGGRESSIVE BV06 /* Attacks PC's */ ACT_NOWANDER BV07 /* Stays in same sector type */ ACT_WIMPY BV08 /* Flees when hurt */ ACT_PET BV09 /* Auto set for pets */ ACT_TRAIN BV10 /* Can train PC's */ ACT_BANK BV11 /* Mobile is a banker */ ACT_WEAK BV12 /* Cannot carry anything */ ACT_SMART BV13 /* Can talk */ ACT_NOCORPSE BV14 /* Disappears after fight */ ACT_LANGUAGE BV15 /* Can teach languages */ ACT_BODY BV16 /* Body parts are used */ ACT_RACE BV17 /* Uses race table */ ACT_CLAN_GUARD BV18 /* Clan Guards */ ACT_IS_HEALER BV19 /* Sells healing services */ ACT_WILL_DIE BV20 /* Purely Internal */ ACT_NOFIGHT BV21 /* Doesn't attack */ ACT_CLASS BV22 /* Uses class table */ ACT_GUARD BV23 /* Carries out guard functions */ ACT_FAMILIAR BV24 /* is a familiar, and conveys benefits */ ACT_UNDEAD BV25 /* No corpse or body parts */ ACT_IDENTIFY BV26 /* Can identify objects for fee */ ACT_CITIZEN BV27 /* Is a citizen of the are, affects legal status in area - MUST CODE */ ACT_NOASSIST BV28 /* Will not autoassist others - MUST CODE */ ACT_REQUEST BV29 /* Will honor the REQUEST command - MUST CODE */ ACT_MOBINVIS BV30 /* is invisible to mortals like AFF_ETHEREAL */ ACT_WARHORSE BV31 /* Can be ridden in combat without penalty */ Affect Flags AFF_INVISIBLE 2 The mobile is invisible. AFF_DETECT_INVIS 8 The mobile can see invisible players. AFF_SANCTUARY 128 The mobile is affected by the spell sanctuary. AFF_FAERIE_FIRE 256 The mobile is affected by the spell faeire fire. AFF_UNDERSTAND 2048 The mobile can understand anyone. AFF_SNEAK 32768 The mobile is sneaking, players to not see it move. AFF_HIDE 65536 The mobile is hiding. AFF_FLYING 524288 The mobile is flying always. AFF_PASS_DOOR 1048576 The mobile can walk through locked doors. AFF_STEALTH 2097152 The mobile can hide and sneak continually. AFF_CLEAR 4194304 The mobile can walk through thick vegetation. AFF_HUNT 8388608 The mobile chases fleeing characters, if possible. AFF_TONGUES 16777216 Allows the mobiles to speak all languages. AFF_ETHEREAL 33554432 Makes the mobile absolutely invisible to system *** Note: Please remember not to use any combination of values that will select a bit outside of those shown. Although combining valid bits are allowed. *** Simple/Complex The 'S' at the end of the affects field is a placeholder that is ignored by this mud. It should always be an 'S'. Originally it was to select Simple or Complex mobiles in Diku muds. It is here to support future implementation. *** BODY PARTS You must give a flag to tell the mud that this is a valid field. This flag is ACT_BODY, and should obviously go in the Action Flags field. If the ACT_BODY flag is not set, then body parts will be ignored. Body parts will also be ignored if the mobile is flagged ACT_RACE. *** ATTACK PARTS This field is normally ignored on the mud, but with the ACT_BODY flag selected, the field becomes the attack parts of the mobile. Attack parts is how the mobile attacks. The different kinds of attacks from various body parts do not affect damage, as it only changes what is printed when the attack takes place. This feature is required, but is there to give the mobiles the correct forms of bare-hand attacks. Attack parts use the same field values as that of the body parts. Mobiles with weapons will always override the different kinds of body attacks. Any mobile that is not flagged ACT_RACE MUST have attack parts set, else it will have no parts to attack with. Below are the flags and spams for attack parts listed. BODY_HEAD head butt BODY_MOUTH bite BODY_EYE evil-eye BODY_NONE shoulder slam BODY_NONE hip slam BODY_FOOT_2 knee BODY_HAND_2 elbow slam BODY_WING flap BODY_TAIL tail slap BODY_TENTICLE tenticle whip BODY_HORN horn jab BODY_CLAW_1 claw BODY_HAND_1 punch BODY_FOOT_1 kick *** HITPOINTS and DAMAGE The functions of hitpoints and damage are arrayed randomly by the mud, as a function of imaginary dice and bonuses. These always follow the form xdy+z, where x is the imaginary amount of dice, y is how many sides these dice have, and z is a constant being added to the final total. For example, our example mob had hitpoints of 1d6+2: a random number between 1 and 6, then add 2, for a range of 3-8. Another mob might have 10d10+150 for a range of 160-250. Damage is calculated the same way. These fields must follow the form xdy+z, even if z equals 0! For instance, our example mob does 1d4+0 damage with its bare hands... Leaving any of these fields blank will cause errors for the load procedure. One more important thing to know about damage: this is the mob's damage with its fists/claws/what-have-you. If the mobile is wielding a weapon, the damage of the weapon overrides the barehand damage. Standards and Measures The best way to determine the strength of mobiles for hit points, level and damage, is to refer to the monster listings in the D20 SRD. *** GOLD This is simply the amount of gold that the mobile is carrying when it is loaded. All mobiles can carry some amount of gold. maximum gold : level*1500 *** RACE The creator must define the ACT_RACE bit in the action flags, and then use one of the RACE_ types in this field. This will fix the mobile as to what language it speaks and understands. It determines many characteristics such as racial type, abilities, bonuses and etc. It will also allow mobprogs to be used based on race. *** POSITION A mob will be loaded into its loading position initially, and after fighting, will return to its default position. The valid positions are: POS_SLEEPING 4 POS_RESTING 5 POS_STANDING 7 There are a few more positions than these, but are not used except during fighting, which the mud takes care of automatically. *** GENDER This is the sex of the mobile, and has only three possible values: SEX_NEUTRAL 0 SEX_MALE 1 SEX_FEMALE 2 *** TIPS and OBSERVATIONS Mobs wander around by default. Remember to include the 'Sentinel' Action flag for stationary mobs! Freak mobs can be simulated by loading them sitting and agressive, with a default position of standing. After being attacked, they will wander around instead of sitting back down! Other interesting things can be done with the position values as well... Don't forget to add the 'smart' Action flag if you want your mob to talk. Neither add 'smart' to all mobs, unless you want a boar to shout for revenge when it tries to get back at an attacker. 6. The #OBJECTS section An object is any item in the game, be it unmovable rock, the fountain in market square, or that nice sword Everyman the Ranger has. Everything the mud needs to know about objects can be found in the #OBJECTS section, except for where they actually are. This section in the .are file will always start first with this line: #OBJECTS This section in the .are file will always end with with this line: #0 *** OBJECT ARCHETYPE <#vnum> <name list>~ <short description>~ <long description>~ <description>~ <item type> <item flags> <wear locations> <value0> <value1> <value2> <value3> <weight> <cost> <level> [obj program] E <extra name list>~ <extra description>~ A <apply type> <apply amount> The night has begun. C <attack message>~ <classes that may use weapon> Here is an example object, followed by a line-by-line breakdown: ---example follows this line--- #QQ00 sword example~ an example sword~ An example sword lies on the ground, examping.~ It looks very shiny and polished, as if someone is taking care to try to make a good example. ~ ITEM_TYPE_WEAPON FLAG_MAGIC|FLAG_ANTI_EVIL CAN_WEAR_WIELD|CAN_WEAR_WIELD 0 MATERIAL_STEEL 10 SIZE_MEDIUM WEAPON_TYPE_SWORD_LONG WFLAG_BANE RTYPE_REPTILIAN 10 0 0 0 0 5 1000 10 E example~ This is a rather boring example. ~ A APPLY_STR 1 C slash~ FLAG_CLASS_FIGHTER ---example precedes this line--- Note: In the file, and amount of spaces or returns can separate different fields, so the extra return and spacing in the above example is valid. *** Field by Field Breakdown The following is a list of each of the fields of the Object format. *** Vnum #QQ00 This is identical to the method of the mobile vnum. This number may be the same as a room or mobile, but no other object may have this number. See the section on virtual numbers in Part 3 of this Handbook. *** Name list sword example~ The words can be used to manipulate the object. In this case, either of the words 'sword' or 'example' can be used in conjunction with a wield, drop, take, etc. This field requires a '~' or tilde at the end of the line. For use with mob_progs and obj_progs all names are appended with a special name starting with 'I' and followed by the vnum of the object. This is used to specifically point to a particular key, if the player has several keys. ex: item vnum is 9775, added keyword is 'I9775' *** Short description an example sword~ This is seen when the object is the target of a command: 'You wield an example sword.' 'You give an example sword to...'. *** Long description An example sword lies on the ground, examping. ~ This is what a player sees if the object is lying in a room by itself. *** Description It looks very shiny and polished, as if someone is taking care to try to make a good example. ~ In Mud20, this field is used as the default "look" at the item, for example, if you did "look sword" while holding this item. Diku used this field for an action, and Merc ignored it. *** Object Type ITEM_TYPE_WEAPON This number is what type of object this is...a weapon. See 'OBJECT TYPES' below. *** OBJECT TYPES ITEM_TYPE_LIGHT 1 ITEM_TYPE_SCROLL 2 ITEM_TYPE_WAND 3 ITEM_TYPE_STAFF 4 ITEM_TYPE_WEAPON 5 ITEM_TYPE_SYMBOL 6 ITEM_TYPE_SPELLBOOK 7 ITEM_TYPE_TREASURE 8 ITEM_TYPE_ARMOR 9 ITEM_TYPE_POTION 10 ITEM_TYPE_SPELLPOUCH 11 ITEM_TYPE_FURNITURE 12 ITEM_TYPE_TRASH 13 ITEM_TYPE_SHEATH 14 ITEM_TYPE_CONTAINER 15 ITEM_TYPE_QUIVER 16 ITEM_TYPE_DRINK_CON 17 ITEM_TYPE_KEY 18 ITEM_TYPE_FOOD 19 ITEM_TYPE_MONEY 20 ITEM_TYPE_COMPONENT 21 ITEM_TYPE_BOAT 22 ITEM_TYPE_CORPSE_NPC 23 ITEM_TYPE_CORPSE_PC 24 ITEM_TYPE_FOUNTAIN 25 ITEM_TYPE_PILL 26 ITEM_TYPE_PORTAL 27 ITEM_TYPE_ARTIFACT 28 ITEM_TYPE_TOOLS 29 ITEM_TYPE_AMMO 30 ITEM_TYPE_TOTEM 31 *** Object Flags FLAG_MAGIC|FLAG_ANTI_EVIL This determines what is affecting the object. In this case, the item is magical, and it zaps any evil person who tries to wield it. *** OBJECT FLAGS FLAG_GLOW BV01 /* Item glows */ FLAG_DARK BV02 /* Absorbs light - MUST CODE */ FLAG_LOYAL BV03 /* Item does not fall when disarmed */ FLAG_EVIL BV04 /* Evil aura */ FLAG_INVIS BV05 /* Item is invisible */ FLAG_MAGIC BV06 /* Item is magic, has magial aura */ FLAG_NODROP BV07 /* Cannot be dropped, cursed */ FLAG_BLESS BV08 /* Good aura */ FLAG_ANTI_GOOD BV09 /* Zaps good chars */ FLAG_ANTI_EVIL BV10 /* Zaps evil chars */ FLAG_ANTI_NEUTRAL BV11 /* Zaps neutral chars */ FLAG_ANTI_LAWFUL BV12 /* Zaps lawful chars */ FLAG_ANTI_CHAOTIC BV13 /* zaps chaotic chars */ FLAG_ANTI_UNCONCERNED BV14 /* zaps unconcerned chars */ FLAG_NOREMOVE BV15 /* Can't be removed, cursed */ FLAG_INVENTORY BV16 /* Can't be put in containers */ FLAG_BURNING BV17 /* Sheds light, adds fire damage to hit */ FLAG_NOT_VALID BV18 /* internal use only */ FLAG_AUTO_ENGRAVE BV19 /* item auto tags itself to first wearer */ FLAG_FORGERY BV20 /* internal use for forged items */ FLAG_ETHEREAL BV21 /* cannot be seen by mortals */ FLAG_MODIFIED BV22 /* internal use for spells and renames */ FLAG_HIDDEN BV23 /* Item in hidden in room */ FLAG_MASTERWORK BV24 /* masterwork item */ FLAG_NOSCRY BV25 /* cannot be scried with spells */ FLAG_CONCEALED BV26 /* concealed on a PCs person */ FLAG_DEATHROT BV27 /* disappears on PCs death - MUST CODE*/ FLAG_PROTOTYPE BV28 /* for OLC with oset - MUST CODE */ FLAG_BURIED BV29 /* buried underground - MUST CODE */ FLAG_TRANSPARENT BV30 /* items layered under this one can be seen - MUST CODE */ FLAG_UNIQUE BV31 /* only one of this VNUM can be worn by PC - MUST CODE */ *** Wear Flags CAN_WEAR_WIELD|CAN_WEAR_WIELD This flag tells the mud where the item can be worn on a player or mob. An object may be flagged to be worn is several places, such as a band that can go around the wrist and the waist. *** WEAR FLAGS CAN_WEAR_TAKE BV01 /* 1 */ CAN_WEAR_FLOAT BV02 /* 2 */ CAN_WEAR_HEAD BV03 /* 4 */ CAN_WEAR_FACE BV04 /* 8 */ CAN_WEAR_EARS BV05 /* 16 */ CAN_WEAR_NECK BV06 /* 32 */ CAN_WEAR_ARMS BV07 /* 64 */ CAN_WEAR_WRIST BV08 /* 128 */ CAN_WEAR_HANDS BV09 /* 256 */ CAN_WEAR_FINGER BV10 /* 512 */ CAN_WEAR_BODY BV11 /* 1024 */ CAN_WEAR_ABOUT BV12 /* 2048 */ CAN_WEAR_BACK BV13 /* 4096 */ CAN_WEAR_WAIST BV14 /* 8192 */ CAN_WEAR_BELT BV15 /* 16384 */ CAN_WEAR_LEGS BV16 /* 32768 */ CAN_WEAR_ANKLE BV17 /* 65536 */ CAN_WEAR_FEET BV18 /* 131072 */ CAN_WEAR_SHIELD BV19 /* 262144 */ CAN_WEAR_WIELD BV20 /* 524288 */ CAN_WEAR_BOTH BV21 /* 1048576 */ CAN_WEAR_HOLD BV22 /* 2097152 */ *** Material and size types 0 MATERIAL_STEEL 0 SIZE_MEDIUM The first value is unused, and is left for future implementation. The second field is the material type of the item. This affects things like the item's hardness (damage resistance) and the total max hit points of the item. The third value is also unused, and is left for future implementation. The fourth value is the object's size, the size of objects determines various things: The size of armor determines what size character can wear it. The size of a weapon is based on the weapon type, and is set when the weapon type is chosen in OLC, it also determines what size PC can use it. The size of a container determines the max size of an object to be put in it (no, you can't put a spear in a backpack), the size of a sheath determines the size weapon that will fit in it. The other item types use size as a relative comparison, a ring, for example, is diminutive, a necklace is tiny, while a bronze statue, while also treasure, could be medium, or even large in size. Again, size helps to determine whether a character could pick it up, put it in a container, etc. A human isn't going to be picking up a gargantuan anything, even if it's made up of feathers, simply because it's too big. *** Object Values WEAPON_TYPE_SWORD_LONG WFLAG_BANE RTYPE_REPTILIAN 10 0 0 0 0 These are the object's values. What each number means is completely dependant on what Type of object it is. *** OBJECT VALUES The eight numbers consisting of the 'item values' are different for each type of item. This is no longer relevant to the original diku values at all, and most items have totally different uses for each value. The last value, value[7], is used as a modifier for a skill affecting the item. For example, if someone conceals a dagger on their person, the Sleight of Hand roll for the act is stored in value[7]. Any attempt to search for the item will have to beat the value stored there. Below is listed the used values for each item type. If a value isn't listed, it isn't used for that item type: ITEM_LIGHT (1) Value[0]: Not Used Value[1]: Not Used Value[2]: Number of hours the light can be used for. Zero hours means that the light has gone out. A negative number will create an eternal light source. Eternal lights should not be easily obtained. Value[3]: Not Used ITEM_SCROLL (2) Value[0]: Level of the spell on the scroll. Value[1]: Which spell (see list in spells.txt) Value[2]: FLAG_ARCANE or FLAG_DIVINE, whether the spell is divine or arcane. ITEM_WAND (3) Value[0]: Level of spell in wand. Value[1]: Max Charges Value[2]: Charges Left Value[3]: Which spell in wand (see list in spells.txt) ITEM_STAFF (4) Value[0]: Level of spell in staff. Value[1]: Max Charges (1..X) Value[2]: Charges Left Value[3]: Which spell in staff (see list in spells.txt) Value[4]: Which spell in staff (see list in spells.txt) Value[5]: Which spell in staff (see list in spells.txt) Value[6]: Which spell in staff (see list in spells.txt) ITEM_WEAPON (5) Value[0]: The type of weapon (inset weapon types here) Value[1]: Weapon Flags (see weapon flags) (insert weapon flags here) Value[2]: First modifier for weapon flags Value[3]: Second modifier for weapon flags ITEM_TREASURE (8) Value[0]: - Value[1]: - Value[2]: - Value[3]: - ITEM_ARMOR (9) Value[0]: The effective AC. >0 enhances the AC. <0 reduces AC. Value[1]: - Value[2]: - Value[3]: - ITEM_POTION (10) Value[0]: Level of the spell in the potion. Value[1]: Which spell (Listed in spells.txt) ITEM_FURNITURE (12) Value[0]: - Value[1]: - Value[2]: - Value[3]: - ITEM_TRASH (13) Value[0]: - Value[1]: - Value[2]: - Value[3]: - ITEM_CONTAINER (15) Value[0]: Maximum weight the container can contain. Value[1]: Container flags: (insert container flags here) Value[2]: The item-number of the object which can open the object. -1 means no lockability. Value[3]: - ITEM_DRINKCON (17) Value[0]: Maximum drink-units the drink-container can contain. Value[1]: Number of drink-units that are left in the container. Value[2]: The type of liquid in the drink-container, one of: NAME NUMBER DRUNKNESS FULLNESS THIRST -------------------------------------------------------------------- LIQ_WATER 0 0 0 10 LIQ_BEER 1 2 0 5 LIQ_WINE 2 5 0 5 LIQ_ALE 3 2 1 5 LIQ_DARKALE 4 1 1 5 LIQ_WHISKY 5 6 0 3 LIQ_LEMONADE 6 0 0 8 LIQ_FIREBRT 7 10 0 0 LIQ_LOCALSPC 8 3 0 3 LIQ_SLIME 9 0 1 -6 LIQ_MILK 10 0 2 6 LIQ_TEA 11 0 0 6 LIQ_COFFE 12 0 0 6 LIQ_BLOOD 13 0 3 -1 LIQ_SALTWATER 14 0 0 -3 LIQ_COKE 15 0 0 6 The above values for drunkness/fullness/thirst are used per four "units" drunk. The values are expressed in HOURS! Example: Dragon drinks 7 times milk His Drunkness is not changed: (7*0) hours His Fullness increases by: (7*2) hours His Thirst increases by: (7*6) hours The hours above are numbers between 0 and 24. 24 hours is maximum for drunkness/fullness/thirst. When hours are zero for any drunkness/fullness/thirst the person will be sober, hungry, or thirsty respectively. Value[3]: if this value is non-zero, then the drink is poisoned. NOT_POISONED 0 POISONED 1 ITEM_KEY (18) Value[0]: The key-type. This value must match the lock-type the door that the key can open (if the vnum of the key doesn't match the lock-type that is). Value[1]: - Value[2]: - Value[3]: - ITEM_FOOD (19) Value[0]: The number of hours, that this food will fill the stomach Value[1]: - Value[2]: - Value[3]: If this value is non-zero, the food is poisoned. NOT_POISONED 0 POISONED 1 ITEM_MONEY (20) Value[0]: The number of gold coins "in the pile of coins". Value[1]: - Value[2]: - Value[3]: - ITEM_BOAT (22) Value[0]: - Value[1]: - Value[2]: - Value[3]: - ITEM_FOUNTAIN (22) Value[0]: - Value[1]: - Value[2]: - Value[3]: - ITEM_PILL (22) Value[0]: Level of the spell in the potion. Value[1]: Which spell (Listed in spells.txt) Value[2]: Which spell Value[3]: Which spell ITEM_AMMO (22) Value[0]: Ammunition type (matches Value[0] of weapon that will shoot it) Value[1]: Damage (amount of damage caused by the ammo when it hits) Value[2]: Speed (4/second, keep numbers high (20 for fast arrows)) Value[3]: Effective range (number between 1 and 5) To create a ranged weapon with ammo, the weapon must also be created. This is done by adding the vnum of the ammo to Value[0] of the weapon. *** Object Weight 5 The weight of the object. *** Value 1000 The value of the object, in gold coins. *** Level 10 This is the level of the object. It is only valid if the FLAG_LEVEL flag is valid. Emud requires this field to be used. Level is calculated by the game otherwise, to support backward compatibily. *** Extra Descriptions E sword example~ This is a rather boring example. ~ This is an extra description, and behaves EXACTLY like the extra descriptions of rooms. The reader is referred to Part 4 of this Handbook for more information. *** APPLIES A 1 1 These are 'applies' of the weapon...the 'A' signifying that an apply is forthcoming. The second digit is the type of apply, and the third how much the apply is worth. An item apply is a particular effect the item has upon the holder/wielder/wearer's statistics. There can be a maximum of three applies on an item, each requiring their own 'A' flag to let the mud know that there is more than one apply. Thus, a sword that added one to a character's strength, and -10 to his hitpoints would be: A APPLY_STR 1 A APPLY_HIT -10 Below is a list of the different types of applies, and their values. APPLY_NONE 0 APPLY_STR 1 APPLY_DEX 2 APPLY_INT 3 APPLY_WIS 4 APPLY_CON 5 APPLY_SEX 6 APPLY_MANA 12 APPLY_HIT 13 APPLY_MOVE 14 APPLY_AC_ENHANCE 17 APPLY_HITROLL 18 APPLY_DAMROLL 19 APPLY_SAVING_PARA 20 APPLY_SAVING_ROD 21 APPLY_SAVING_PETRI 22 APPLY_SAVING_BREATH 23 APPLY_SAVING_SPELL 24 *** Combat Usages C whack~ FLAG_CLASS_FIGHTER This is a system to change the default statement made when a weapon hits an opponent. It also allows you to specifically define which classes can use the weapon, even if that class cannot normally wield the type of weapon defined by weapon type. The creator should use the weapon type field (value 3) to set up weapons for backstabbing, shooting, throwing, etc. All npc's can wield the item if any class is defined. Class selection method will default to the normal method if no classes are selected (Put a '0' in the field). The weapon defined in the example will 'whack' the opponent, and can be wielded by fighters. List of flags of classes FLAG_CLASS_BARBARIAN BV01 FLAG_CLASS_BARD BV02 FLAG_CLASS_CLERIC BV03 FLAG_CLASS_DRUID BV04 FLAG_CLASS_FIGHTER BV05 FLAG_CLASS_MONK BV06 FLAG_CLASS_PALADIN BV07 FLAG_CLASS_RANGER BV08 FLAG_CLASS_ROGUE BV09 FLAG_CLASS_SORCERER BV10 FLAG_CLASS_WIZARD BV11 FLAG_CLASS_ADEPT BV12 FLAG_CLASS_NOBLE BV13 FLAG_CLASS_COMMONER BV14 FLAG_CLASS_EXPERT BV15 FLAG_CLASS_WARRIOR BV16 FLAG_CLASS_ARCANE_ARCHER BV17 FLAG_CLASS_ARCANE_BLADE BV18 FLAG_CLASS_ASSASSIN BV19 FLAG_CLASS_BLACKGUARD BV20 FLAG_CLASS_DUELIST BV21 FLAG_CLASS_DWARVEN_DEFENDER BV22 FLAG_CLASS_ELDRITCH_KNIGHT BV23 FLAG_CLASS_LOREMASTER BV24 FLAG_CLASS_MYSTIC_THEURGE BV25 FLAG_CLASS_SHADOWDANCER BV26 Please note that FLAG_CLASS_ values are not the same as CLASS_ values *** Object Programs Object programs are based on intercepting user commands, and substituting new ones with actions outside of normal game operation. Several programs may be included on each object. These programs, used in combination with mob_progs can lead to very complex systems of commands. Object programs can also trigger off of basic time increments, damaging others, getting damaged, wearing or removing the object with the program. They cannot trigger off of things that the player sees, or text on the screen. Trigger off things seen on the screen is limited to mob_progs, and will not be included in object programs, due to operational speed problems. Object programs start with a 'P' similar to object extra descriptions. Following the 'P' is a number describing the index value of the program, for branching operations to reference. An object will usually have a group of small 'programs' or execution units that do individual commands. There is always a 'Trigger' that will start the program, and a 'response' that does some form of action. The trigger need not be related to the response. This also means that the response does not know why it was triggered, and responses cannot be based on them. Ex: An object may not give back the same amount of hit points to the player if a damaged trigger was used, but it may give back some fixed amount, because it knows that the player was hit. In programs with the same index, execution of a command will start with the first one that gets triggered regardless of the index number. But the system will then flow through to any subsequent program with the same index number. This will allow the programs to do several routines on one trigger. *** IMPORTANT: Each program set must have a unique index number. Object programs basically follow the format of trigger followed by response. Each type of obj_prog trigger has a special format: Normal command intercept: P <reference number> TRIGGER <percentage> <game command> {responses} Percentage is the chance that the command will be intercepted. Game command is the command you wish to intercept. TRIG_UNKNOWN P <reference number> TRIG_UNKNOWN <percentage> <unknown command> {responses} Unknown command is either a social command, or something new that would not be a normal command, such as "polish" or "brush". TRIG_VOID P <reference number> TRIG_VOID {responses} This is generally used as the end effect of a branching response. TRIG_TICK P <reference number> TRIG_TICK <percentage> {responses} This is triggered once every 4 seconds of real time. It can be used to make the player do things they did not intend to do. Or occasionally modify stats, or any other time based reaction. TRIG_HIT P <reference number> TRIG_HIT <percentage> {responses} This trigger is called every time the player with the object is hit in a non magical way. This can be used to make objects that heal the player every time they are hit, or objects that scream whenever they are damaged. TRIG_DAMAGE P <reference number> TRIG_DAMAGE <percentage> {responses} This is called every time a player damages another character, either a mobile, or player in a non magical way. It can be used to create objects that say something or any other response to the damage given. TRIG_WEAR This is called everytime the object with the program is worn. It can be used to make a magical weapon greet its new owner. TRIG_REMOVE This is called everytime the object with the program is removed. It can be used to remove a disguise that was set upon wearing. TRIG_ROOM_COMMAND This is called everytime a player uses defined command in the room in which the object lies. You can use ethereal objects if needed, it's the result that counts. TRIG_ROOM_UNKNOWN This is called everytime a player uses defined keyword in the room in which the object lies. TRIG_SACRIFICE This is called when a player sacrifises the object with the program. *** RESPONSES Each type of obj_prog response has a special format. The only time a tilde is required is after a string is used. Commands such as OPROG_APPLY should not have a tilde after them. OPROG_ECHO P 1 TRIG_UNKNOWN 100 EXAMPLE OPROG_ECHO bla bla bla bla~ These lines are given to the user only. Be sure to include the tilde. OPROG_GOD_COMMAND P 1 TRIG_UNKNOWN 100 EXAMPLE OPROG_GOD_COMMAND say Greetings& smile self& say the name is $I, Sir $I~ These commands are given at the trust level of 98. This means that the user is able to perform god commands for the duration of the object program. Several commands may be used, and separated by the '&' symbol. The '$' allows you to print player related information: $i name of the player $I name and title of the player $m him her it (based on player sex) $s his her its $e he she it $o short description of the object Always use 'self' to refer to the player when the name doesn't need to be printed. All mobile program commands can be used. It should be noticed that objects can use quest bits to their fullest by allowing objects to read and write both the object's and the player's quest bits. Example: OPROG_GOD_COMMAND mpmset self long A small turtle named $ stands here.~ This would set the description that others see when entering the room the player is in, very similar to the skill disguise. To reset the string to normal game operation, use: OPROG_GOD_COMMAND mpmset self long null OPROG_GOD_ARGUMENT P 1 TRIG_COMMAND 100 flee OPROG_GOD_ARGUMENT say beam me up scotty!& mpecho {170}$I starts to fade and waves goodbye at $s friends.& mpgoto ~ This command allows the use of one command, but the inclusion of an argument. This allows special commands like GOTO to let the user pick a destination. It makes sure that the user cannot put any multi-line commands so they will be limited to the one command given. This is used to give the player the full advantage of the god command. Use this only under permission of the game administrators. $I will print the player's name and honorific, the $s prints his/her/its based on gender. Example of the above program executed by a player named Neophyte. Sword Master Neophyte says 'beam me up scotty!' Sword Master Neophyte starts to fade and waves goodbye at his friends. OPROG_APPLY <APPLY_TYPE> <AMOUNT> P 1 TRIG_TICK 100 OPROG_APPLY OAPPLY_HIT 25 This command is executed to change one of several stats of the player that has the current object. These will only affect the current stats, and never the maximum, as most other object affects to. It is allowed to make the amount either positive or negative. Apply types: OAPPLY_HIT - Applies to current hit points. OAPPLY_MOVE - Applies to current movement points. OAPPLY_MANA - Applies to current mana points. OAPPLY_ALIGNMENT - Applies to current alignment. OPROG_JUNK P 1 TRIG_HIT 100 OPROG_ECHO Your shield shatters into a million pieces!~ P 1 TRIG_VOID OPROG_JUNK This command will destoy the item that is executing the program. This is the only bug free method unlike sacrifice, eat, or mpjunk OPROG_IF_HAS_OBJECT <VNUM> <TRUE DESTINATION> <FALSE DESTINATION> P 1 TRIG_UNKNOWN 100 EXAMPLE OPROG_IF_HAS_OBJECT 21 2 3 P 2 TRIG_VOID OPROG_ECHO I have the object with vnum: 21~ P 3 TRIG_VOID OPROG_ECHO I do not have the object with vnum: 21~ This command will branch successfully if the player has the object in either inventory or equipment, but not in a container. In this case the P 2 will be jumped to if the if check is true. If the if check is false P 3 will be called. Do aknowledge you can only jump to a higher reference number. if a lower number is given than the if check itself the program will be aborted. OPROG_IF OPROG_IF <IF CHECK> <OPERATOR> <VALUE> <TRUE DEST.> <FALSE DEST.> Available IF CHECKS: OIF_WEAR_LOC - wear location (-1 if not worn) OIF_USER_CLASS - user class OIF_USER_POSITION - user position OIF_USER_GOLD - user gold OIF_USER_ROOM_NUM - user room number OIF_RANDOM_PERCENT - random percent OIF_USER_WHICH_GOD - user follows which god OIF_USER_ALIGNMENT - user alignment OIF_USER_LEVEL - user level OIF_USER_RACE - user race OIF_USER_PERCENT_MOVE - user move percent OIF_USER_PERCENT_HITPT - user hitpoints percent OIF_USER_PERCENT_MANA - user mana percent OIF_USER_SEX - user gender OIF_USER_AREA - The first room number of user's area OIF_USER_SECTOR - The sector type the user is in OIF_TIME_OF_DAY - The hour of day in game time OIF_MCLASS_FIGHTER - The amount of war levels OIF_MCLASS_RANGER - The amount of Gla levels OIF_MCLASS_ROGUE - The amount of Mar levels OIF_MCLASS_MONK - The amount of nin levels OIF_MCLASS_DRUID - The amount of dru levels OIF_MCLASS_BARD - The amount of sor levels OIF_MCLASS_CLERIC - The amount of sha levels OIF_MCLASS_WIZARD - The amount of wlc levels OIF_WEATHER - ( 0 = Clear, 1 = Cloudy, 2 = Raining, 3 = Storm ) OPERATOR < - Less than > - Greater than = - Equal to ! - Not equal to VALUE The value is a number that the check variable is compared against. True destination is the obj_prog index (the one listed after the 'P') that the branch will continue when the if check is true. False destination is the obj_prog index that is executed when the if check is false. If the destination number is not found, then the branch will not be successful, and the program will stop. This can be used for branches that are not necessary to the operation of the program. When using 0 as the destination number the program will always abord. It's suggested to use 0 so an area admin won't waste time looking for a non existant destination number. OPROG_QUEST_SET <OFFSET> <NUMBITS> <VALUE> P 1 TRIG_UNKNOWN 100 EXAMPLE OPROG_QUEST_SET 0 4 15 This is a method of setting the value of the quest bits on an object. The offset is the starting bit number of the grouped quest numbers. The numbits are the amount of bits involved with the defined value. The value is the desired value of the set. OPROG_QUEST_ADD <OFFSET> <NUMBITS> <VALUE> P 1 TRIG_WEAR 100 OPROG_QUEST_ADD 4 4 1 This is a method of adding a value to the quest bits of an object. The offset is the starting bit number of the grouped quest numbers. The numbits are the amount of bits involved with the defined value. The value is the desired increment being added to the quest bits. The number inside the defined bit range will never overflow to higher bits, or go below zero. The value may be negative to subtract. This can be used to make items that have limited lifespan. In this example the value will go when wearing several times to : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 and so on. OPROG_PLAYER_QUEST_IF <OFFSET> <NUMBITS> <OPERATOR> <VALUE> <TRUE> <FALSE> OPROG_OBJECT_QUEST_IF <OFFSET> <NUMBITS> <OPERATOR> <VALUE> <TRUE> <FALSE> P 1 TRIG_UNKNOWN 100 TEST OPROG_PLAYER_QUEST_IF 0 1 = 1 OPROG_ECHO Your first bit has value 1~ The quest if check allows branching to other obj_progs. The offset is the starting bit number of the grouped quest numbers. The numbits are the amount of bits involved with the defined value. The quest bits checked will be those of the area the object belongs to. Operator: < - Less than > - Greater than = - Equal to ! - Not equal to The value is a number that the check variable is compared against. True destination is the program index (the one listed after the 'P') that the branch will continue when the if check is true. False destination is the obj_prog index that is executed when the if check is false. If the destination number is not found or goes backwards, then the branch will not be successful, and the program will stop. This can be used for branches that are not necessary to the operation of the program. It's good practise to branch to 0 in this case, which will always abord the program. ** Example Programs: P 1 TRIG_COMMAND 45 say OPROG_GOD_COMMAND mpechoat self {160}You are occasionally tongue tied.& mpechoaround self $n tries to speak but $e seems tongue tied.~ P 2 TRIG_UNKNOWN 100 HOME OPROG_IF OIF_WEAR_LOC = WEAR_NONE 3 4 P 3 TRIG_VOID OPROG_ECHO You must wear the example object (with program) to go home.~ P 4 TRIG_VOID OPROG_GOD_COMMAND mpechoaround self {030}$I says 'I'm going home!'& mpgoto 9755& say I'm home!~ Explanation: The first section of the program is a simple command trigger. 45% of the time that the user tries to use the 'say' command, it will not be functional, and the user will see the response that he is tongue tied. The mpechoaround will send the same message to everyone but the user standing in the same room. The rest of the program checks when the user types the unknown command 'HOME'. If that is typed, then the If Check checks for the wear location of the object. If the wear location equals WEAR_NONE (item is not worn), then the command continues with program 3. If the item is worn, then the program will continue with program 4. The next program has a void trigger, and can only be reached by the previous branch statement. The user is messaged to wear the object. The final program has a void trigger too. Faking that the player says he is going home, then to 'mpgoto', a mob command, the location of 9755, which is the square in the city of Roterodamum. Then the user is forced to say: I'm home! Notes on obj_progs: It can easily be seen that there is a very large amount of room for improvement on object_programs of this type. This system has been set up because obj_programs are searched MANY more times than mob_progs, and require a significantly longer amount of CPU time to process than mob_progs. Therefore a tokenized method was developed instead of the interpreted system of the mob_progs. Essentially the format in the .are file is the same that the database system saves all the information. Using this tokenized system is at least 4 times faster for the CPU than an interpreted based system. More complex object programs can be realized by asking the Emud implementors to add new types of triggers and responses. This system is relatively new, and has not been fully tested for CPU usage, but early tests show that the response time is such that 50 people having 20 items with complex programs each, should not noticeably degrade system performance. For the sake of safety, both the commands of 'save' and 'quit' are removed from those allowed in obj_prog responses. Be very careful with using the god commands, as they can permanently change the statistics of players, rooms, and just about anything in the game. *** Important: It is allowable to delete the item as a final command. The JUNK command will always automatically terminate object programs, regardless if the object program continues. QUEST BITS: This is generally a very complex system to initially understand, therefore The following is a detailed description of how quest bits work. Quest bits are used in 3 places. -Each player has a set of quest bits for each area, so that a player may be on several quests, and each area has it's own set, without worrying about other areas. -Each mobile has one set of quest bits. (not saved during crashes) -Each item has one set of quest bits. It should generally be considered that you should not allow modifications of quest bits by an something from one area to another. As each set of quest bits are defined completely by the area creator. Quest bits are used to allow the area creator the ability to define their own set of variables that are constant for that individual, object, or mobile. This means that once the value is set, it is saved throughout the game, and allows various states, or steps in a quest to be marked. The definition of a quest is the ability of the game to know how far a player has gotten in an area regardless if they come back to the game several days later. Each set of quest bits is really a set of user definable 128 bits. Some knowledge of binary numbers helps in decifering this system completely, but is not necessary. The offset is always the starting point of where the defined value is. The amount of bits defines the totaly range of the values used. With basic binary system, the amount of bits define an exponential range: 1 bit - 2 values 2 - 4 3 - 8 4 - 16 5 - 32 6 - 64 7 - 128 8 - 256 Ex. Say a creator wants to have 4 states on an object. The first being the initial state, the second when a player hits a mobile, the third when the player goes to sleep, and the fourth when he wakes up. The area creator wants an object that poisons the player when he attacks a mobile, and damages them when the player wakes up. The player is even informed that when he wakes up next, he will be hurting very bad. Since there are only 4 states, only 2 bits are required. Be aware that's only 2 out of 128 bits, this means you can pick the first available bits, but also the last available bits. Below we'll see some asci art showing the first 32 bits, be aware that the first bit has the location: 0, and bit 32 has location: 31 In this example we'll only use the 5th and 6th bit, they're at locations: 4 and 5 30 28 26 24 22 20 18 16 14 12 10 9 8 7 6 5 4 3 2 1 0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X| | |X|X|X|X| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ("X" indicates an unused bit) A bit has either value 0 or 1 which allows you to make 4 values: 00 = 0 (initial state) 01 = 1 (player has hit mobile) 10 = 2 (players has gone to sleep) 11 = 3 (player has woken up) If this is clear to you we'll once again concentrate on how to read and how to write these bits. Reading the bits: OPROG_OBJECT_QUEST_IF 4 2 = 3 6 8 Freely translated: start reading at bit 4 + read 2 bits if equals : 3 --> true: branch to program 6 false: branch to program 8 Writing goes almost the same way : To set the bits to have the value 2 --> OPROG_QUEST_SET 4 2 2 Now what if you don't understand a single bit of the above? This is possible if you're not familiar with computer science. In that case you can use a set amount of values that always work. In that case we suggest you always use the format to remember 16 steps of a player's or object's quest bits: OPROG_QUEST_SET 0 4 <value ranging from 0 to 15) OPROG_OBJECT_QUEST_IF 0 4 = <value ranging from 0 to 15) The object starts with a value of 0 use OPROG_QUEST_SET 0 4 2 to set quest to 2 use OPROG_OBJECT_QUEST_IF 0 4 = 5 to see if the quest equals 5 This will work for any value ranging from 0 to 15, thus there is no huge need to know how stuff exactly works, as long as you can use it. *** TIPS and OBSERVATIONS Items with applies to stats over +3 should be very rare on most muds, and hard to get. A lot of small items make an area more interesting than a few incredibly powerful items, for the most part. This is very subjective, however. Items that are too powerful may be changed by the game administrators, which usually annoys the administrator more. The better the area, and the quest you've written, the better the objects. Remember to put take wear-flags on almost everything. It's easier to put a take wear-flag on everything, and take off the ones you don't need (like fountains and such). don't feel limited to items players consider 'useful', such as weapons and armor. A giant (untakeable) monolith, and other strange and odd items can add a lot of atmosphere to an area. The FLAG_INVENTORY has very special purposes and should not be used for normal items. An object that is flagged as inventory will follow the player, even in death. A mobile that is killed with an object that has an inventory type item will automatically delete the item. This is useful for creating objects that the player desires, but cannot get. An object with this flag can be given to the player by a mobile with mob_progs, or picked up off the ground. 7. The #SHOPS section The #SHOPS section tells the mud each shop the kind of items it deals in. It also tells the profit margins, and the hours open. Usually all the numbers are on one line. *** Shop Archetype <Mob vnum> <type1> <type2> <type3> <type4> <type5> <%sell> <%buy> <open> <close> *** Mob Vnum This is the mobile that works in the shop. *** Type These five values are the ITEM_TYPE numbers that the shop deals in. The shop will only buy or sell these types of items. Leaving a '0' in any of the slots will allow the shop to deal in less than five types of items, but a shop may never deal in more than five. *** %Sell This is the percent of the normal value of an object when the shopkeeper sells it to a player. Usually around 100. This number is limited by the system and can only be 100 or higher. *** %Buy This is the percent of the normal value of an object when the shopkeeper buys it from a player. Usually around 50. This number is also limited by the system and can only be 100 or less. *** Hour Open This field is a number from 0 to 23 that is the hour that the shop opens. *** Hour Close This field is a number from 0 to 23 that is the hour that the shop opens. *** Note: Comments may be added after the Hour Closed following a ';'. The comments can only be as long as the screen length. *** Note: Shops on Emud can be browsed through during off hours, but nothing can be bought there. All shops are considered safe rooms at all times, even in off hours. 8. The #RESETS section The #RESETS section tells the mud where everything goes, from the goblin in the pit to what the knight is wielding and putting the fountain in the square. This section is simple a list of commands. The zone commands tell the mud exactly how to reset a zone, from mobs to objects, to closing doors. Each command is given its own line, one after the other, until the end of the file. Comments can be added for clarity's sake example: ; big guy with sword Areas reset based on the average of all the levels of the mobiles in the area. Low level areas take about 5 minutes to reset, and high level areas take about 15 minutes. This number is fixed and continuous regardless of how many players are in the area. *** Standard Fields <if-flag> An if flag tells the mud to look at the previous command. If the if-flag is 0, the mud will try to execute the command regardless of the previous command. If the if-flag is any other than a zero (one is most commonly used), then that particular command will only execute if the command immediately preceding it did as well. This is useful for objects loaded onto mobs; you don't want to load a shield on a guard that didn't get loaded, for example. All in all it doesn't matter much. <max #> This is the maximum number of whatever this is can exist in the mud. If on a mob command, this will do nothing. On an object command, this limits how many of this object are available in the game. For items not limited, it is common to put a very high number in this slot, 100 should do in most cases. For something like recall scrolls you can settle for 999 *** List of all Commands M <if-flag> <mob vnum> <maximum> <room vnum> G <if-flag> <obj vnum> <maximum> E <if-flag> <obj vnum> <maximum> <wear location> O <if-flag> <obj vnum> <maximum> <room vnum> P <if-flag> <obj vnum> <maximum> <container vnum> D <if-flag> <room vnum> <exit direction> <door flag> R <if-flag> <room vnum> <last exit to randomize> *** M <if-flag> <mob vnum> <maximum> <room vnum> The M reset loads a mobiles to a certain place in the mud. *** G <if-flag> <obj vnum> <maximum> The G reset loads an object and gives it to a mobile loaded in the reset immediately previous. Note that this is different from the E reset below, in that the E reset loads an object and makes the mob equip it. A G reset object stays in the mob's inventory. To make a unique item the <maximum> should be 1. Generally this means that the object will not load if any others exist in the game. There is a basic 20% chance that the object will load anyways when the mobile resets. A mobile will reset after it is killed on the next area reset. *** E <if-flag> <obj vnum> <maximum> <wear location> The E reset loads an object and makes the mob loaded in the reset immediately previous to this one equip it. Where equipment position is _one_ of the following: WEAR_LIGHT 0 WEAR_HANDS 9 WEAR_FINGER_L 1 WEAR_ARMS 10 WEAR_FINGER_R 2 WEAR_SHIELD 11 WEAR_NECK_A 3 WEAR_ABOUT 12 WEAR_NECK_B 4 WEAR_WAIST 13 WEAR_BODY 5 WEAR_WRIST_L 14 WEAR_HEAD 6 WEAR_WRIST_R 15 WEAR_LEGS 7 WEAR_WIELD 16 WEAR_FEET 8 WEAR_HOLD 17 *** O <if-flag> <obj vnum> <maximum> <room vnum> The O reset loads an object into a room. This is mostly used for unowned or immovable objects. To make a unique item the <maximum> should be 1. Generally this means that the object will not load if any others exist in the game. There is a basic 20% chance that the object will load anyways when the area resets. *** P <if-flag> <obj vnum> <maximum> <container vnum> The P reset loads an object, and places it into another object (container-type) that was previously loaded. *** D <if-flag> <room vnum> <exit direction> <door flag> The D reset can open, close, or close and lock a door every repop, Where door flag is _one_ of the following: DOOR_OPEN 0 DOOR_CLOSED 1 DOOR_CLOSED_LOCKED 2 Where exit direction is one of the following: DIR_NORTH 0 DIR_WEST 3 DIR_EAST 1 DIR_UP 4 DIR_SOUTH 2 DIR_DOWN 5 *** R <if-flag> <room vnum> <last exit to randomize> The R reset randomizes the specified exits in a room. Where <last exit to randomize> is the number equivalent of the first exit in the room to not randomize. For example: R 0 6495 3 would randomize the north(0), east(1), and south(2) doors of the room with the vnum 6495. Swapping only those three exits. *** TIPS and OBSERVATIONS Remember, a functioning door is a door from both sides, and needs to be closed from both sides. Thus, 2 door resets for each door. The P reset gets confused if you try to load multiple objects into multiple containers IF the containers are all the same object. The solution is to copy the container over into the #OBJECTS section with a different vnum however many different containers you need. 9. Putting it all together. This section is simply composed of building tips for novice builders. This is very subjective, and based on the experiences of the builders at the Curious Area Workshop. Not all these techniques may be of use to your average builder. Absolutely, positively use the AREACHECK utility. The areacheck utility comes with the utilites section of documents that goes along with this document. The areacheck will normally allow the area to start right up unless you have doors specified wrong, or have problems with obj_progs or mob_progs. Areacheck does a VERY good job of checking syntax, such as numbers that are off or spacing that is wrong. It also checks the syntax or spelling of all the text versions of flags. Learn to build without an area editor first. Its a lot easier to troubleshoot when you understand what exactly goes on with all those numbers in those files... This is very important because most area editors are designed for Merc or Diku areas. They are actually fine for making a framework for the area, but realize that MANY differences crop up in creating Emud areas. And the creator must then use a text editor to finish out the area. Also the editors tend to make little errors, crashing the area editor and leaving one without advanced knowledge helpless. Do it on paper first. Do it big. Having a map to work from helps a LOT when doing exits, and provides a visual impetus to getting all those tedious bits done. Do the #ROOMS section first. The #ROOMS section almost always takes the longest. Once past that long fight, the #MOBILES and the rest will come easier. Save Mobile programs and Object programs till the very end. It is simpler to create obj_progs and mob_progs when all the mobiles and objects are in place, and the rooms are finished. BE aware that you might end up redoing alot of rooms, mobiles and objects because you want certain things in your quest which you make up while working on it. Therefor it is suggested to think very well about the quest you want to make. Write it down in steps. Then build your area such way that you can implement all the mobile and object programs without having to make heavy changes. Your #RESETS file will always be wrong on the first try. -Get used to it. Your mobile and object programs will suck and work badly on the first try. -Keep working on them till they work as you desire. For random mob distribution, use this method: (this was contributed by Locke of CthulhuMUD) Make a room, with exits to all the places that you would like mobs to come out of, in all 6 directions. Load all mobs to be randomly distributed in this room, and they'll choose and walk out themselves! (if they're not sentinel). For a big area, several of these 'mob chutes' can be connected for a bubble-sort effect. An area will take twice as long as you think it will to build. a certain boredom sets in sometimes. just set it aside for awhile if this happens; its better to build when you want to then turn out something uninspired. If you plan on using obj_progs or mob_progs then the area will take four times as long as you expect. If you plan on using quest bits, then count of it taking much longer than you expect, with several errors. Mobile and object programs are a MUST however, once you learn how to use them properly you'll be able to create an area unparalised by areas without progs. Be fair with the items: Good items should be hard to get. Lousy items should require much less effort. Give the ordinary stuff to the mobs to wear, and reserve the good stuff as a reward for the cool quest you'll hopefully write. Always remember that items and objects can easily get out of scale, and all areas can and probably will be modified by the implementors of a Emud system. This is to be expected, so don't get too put out. Contributions to this section are welcome, and will be added with proper credits. 10. Credits Special Thanks to Tarkin of NaVieMUD and MJPrime of AlbertMUD for invaluble help in writing this Handbook. Extra Special Thanks to all the Players of NaVie (128.213.5.14 4001), for all the help during the Buggies & Bounties competitions. Builder_5 11/11/93 ftp.cs.odu.edu \pub\caw Modifications for MrMud v1.2 written on (incredibly) 11/11/94 David Bills (Chaos on Mortal Realms - hydrogen.ee.utulsa.edu 4321) Doug Michael (Order on Mortal Realms - hydrogen.ee.utulsa.edu 4321) Modifications for Emud v2.2 written on 12/12/01 Scandum (Demise on Storms of Time - minas-2.demon.nl 4321) =============================================================================== FILE: "mob_prog.txt" === MOBprograms MOBprograms are a way to make your mobiles more interesting. This basic version has enough to get things going, and should be quite readable and understandable and more to the point, extendable. The remainder of this document describes MOBprograms and gives a couple trivial examples. Table of Contents: The Basic Idea MOBprogram Syntax Associating MOBprograms With A Mobile Trigger Types Variables Control Flow Syntax Operators If_Checks In Control Flow MOBcommands Of Interest Regarding CPU Slowdown Miscellaneous Information Credits -------------------------------The Basic Idea---------------------------------- Ever wonder why most muds either seem dead or overcrowded? The answer is probably partially due to the fact that the mobiles never do anything but wait to be slaughtered. Unless someone has gone to great lengths and added many special procedures, most mobiles have no idea you are in the room with them and rarely listen to what you say. The typical Midgaard mayor wanders happily along even when the populace pokes him, waves his City Key about, unlocks his gates, or frenchs his secretary, etc. So a way to give the mobiles a bit more spirit would be neat. -Enter Mob Prog- The backbone of the MOBprograms shall be called triggers from this point on. Essentially, they are procedure calls placed in sneaky places in the mud code which provide the context for what is going on around the mobile. So, if something happens in the mobile's room and a trigger is activated, then a list of commands is sent to the interpreter in the mobile's name, thus making her/it/him do an appropriate something. Since knowing the appropriate response for every mobile to every possible trigger is not easy, this command list shouldnt be a rigid script, but needs to be somehow unique for the mobile and the situation. However, in order to know the situation, a mobile needs to know more about the trigger than that it just happened. So, we have to include some sort of variables as well to set the context appropriately. As most implementors know, most area creators are not versed in coding, but usually have great ideas. Therefore, whatever system is used needs to be quite simple. This is not to demean creators in anyway. Simply, it is useless to have a powerful system, if the only person able to write anything is someone who finds C coding in general to be exciting and non frustrating. If that is going to be the case, then stick to the special procedures, since there is no bound to what a complex special procedure can accomplish. Yet, from experience working on several muds, most admins and implementors prefer not to be writing one shot spec_procs to satisfy the needs of their creators. And not to be demeaning toward implementors, area creators who never wrote a c program have constructed mobile programs being far more complex and entertaining than 99% of the spec_procs. Thus, the basic idea: let mobiles react to a myriad of mud events/situations by having them perform a list of commands which can be tailored to the moment through a simple and unintimidating scheme usable by any creator. ------------------------------MOBprogram Syntax-------------------------------- The simplest way to describe any syntax is by example, so here goes. First, define the notation: anything contained in braces {} is required, anything in brackets [] is optional, anything in quotes "" is a case insensitive literal, NL refers to a required new-line. The meanings of the labels used will be described following the syntax diagram. ">" {trigger_type} " " {argument_list} "~" NL {program_command_1} NL {program_command_2} NL {program_command_3} NL . . . {program_command_N} NL "~" NL === Explainations A TRIGGER_TYPE is one of the available triggers. A PROGRAM_COMMAND can be any legal mud command, or a control flow command. The ARGUMENT_LIST depends upon the trigger, but it is always parsed into the system as a character string. This is an example of ONE MOBProgram block for a mob. --------------------Associating MOBprograms With A Mobile---------------------- There is only one way for the mud to associate the program with the mobile. The result is a link list of mob_programs which are attached to the mobile_prototype. This is done at boot time, and so only one copy is kept, regardless of how many instances of the mobile are running about. In the #MOBILES section of your area files, at the end of the mobile's block (i.e. on the line following the typical position/default position/sex line), append any number of MOBprograms blocks (using the syntax above) followed by a line starting with one '|' (pipe). Example provided: holygrove.are -----------------------------Trigger Types---------------------------------- Triggers are fairly easy to add, but this basic list should hold for most needs. Their names, argument list syntaxes, and translation into more articulate english are given below: *** act_prog [p] <ARGUMENT> The argument is a list of keywords separated by spaces. If the first word is the character 'p' by itself then the rest of the word list is considered to be a phrase. If the first word is the character 'k' by itself then the prog checks to see that all of the words in the word list are present in the checked text. The trigger is activated whenver a keyword (or the phrase) is contained in the act() message. Both the phrase and keywords are case insensitive. This is the most general trigger. It applies to almost every event which happens in the mud. Anytime the function act() is called with a message to be delivered TO_CHAR,TO_VICT,TO_ROOM, etc. the act can be triggered. Basically this will trigger on almost everything you'll ever want (and some things you wont as well). Do aknowledge only players can trigger an act_prog, mobs will be ignored. Example >act_prog p pokes you in the ribs.~ This trigger will only be activated if a mobile receives a message in which the above five words are found in the exact order and spacing given. Note that the period is needed because the words must be found on their own. This eliminates confusion when the keyword is 'hi' and a message with the word 'this' is being checked. *** buy_prog <ARGUMENT> The argument is an object number, like a give_prog, use the 'I' format for the object number. This only works on a shopkeeper and is triggered when an object of this obj number is purchased by a player. Example >buy_prog i432~ This trigger will only be activated you purchase item i432 from the mobile with the prog. This is handy for having the mobile explain the item, or modify the item based upon the purchaser. This prog does not interrupt the actual transaction, though it may eventually be modified to do so, to allow a purchase to pass through if checks. *** cast_prog <ARGUMENT> The argument is the name of a spell. The prog does a skill_lookup on the entered phrase to see if the spell being cast by a player matches. The prog triggers if so. Example >cast_prog detect magic~ This trigger will be activated if the player casts detect magic in the same room as the mobile, obj, or room with the prog. The potential for this trigger is myriad, allowing a mobile to react to the caster with speech, counter spells of its own, hostile reactions, etc. This prog does not actually interrupt the spell, only triggers in reaction to it. *** damage_prog <NUMBER> The argument is a percentage chance. This prog is only set upon an object, and only an object equipped by a player. It can trigger when the player wearing or holding the object damages another player. Example >damage_prog 20~ This trigger will be activated if the player injures another player, if the percent check is 20 or lower. This program can do things like applying additional affects to the player or his victim, or other effects, like an evil sword that makes eerie sounds when it harms a victim. *** hit_prog <NUMBER> The argument is a percentage chance. When set upon an object, it triggers when the object wearer is damaged by a physical attack. When set upon a mobile, the program triggers whenever the mobile is damaged. *** intercept_prog <ARGUMENT> The argument is a command word or words. This powerful trigger allows almost any word to become a command. It can also do as its name implies, and intercept any actual command and replace the command's actions with the mobile or object's own. Example >intercept_prog north~ This would intercept the command 'north', even if only the letter 'n' is issued. This could allow a mobile to check conditions before allowing a player to actually go north. Note that this trigger does actually interrupt the actions of an existing command, and in order to allow the command to pass as typed at some point during the program, there must be an 'mpunintercept' command. For example, after checking conditions for northward travel, as above, mpunintercept at the end of the program would allow those meeting the conditions to do so. *** speech_prog <ARGUMENT> The argument is the same as for an act_prog. A word or phrase (when the character 'p' by itself is the first word in the word list) triggers the event. Example >speech_prog dog~ This is only triggered when the keyword is contained in a message which has been said by a PC in the same room as the mob. >speech_prog p brown dog~ This prog is only triggered when the words 'brown dog' are used together in the statement. The PC restriction is not necessary, but makes infinite loops between two talking mobiles impossible. It also makes it impossible for two NPC's to stand and discuss the weather however. *** sayto_prog <ARGUMENT> This works like a speech_prog, except that it only triggers if the saying is targeted to the mobile using sayto. If the first word is the character 'p' by itself then the rest of the word list is considered to be a phrase. If the first word is the character 'k' by itself then the prog checks to see that all of the words in the word list are present in the checked text. This is a vast improvement on the old speech_prog, which will trigger on the correct word or phrase, regardless of who it's said to, or in what context. With this prog, there's the intent to speak to the mobile that is required. *** trigger_prog <ARGUMENT> This works like a speech_prog, except that it only triggers from a mobile using the MPTRIGGER command. If the words in the mptrigger argument match the word or phrase in the trigger, then the program activates. This is the way that mobiles can communicate and conspire together. You can use mptrigger to summon reinforcements, to order another mobile to follow a mobile's orders, or even to just make two mobiles talk to each other in flavor dialog. *** social_prog <ARGUMENT> The argument is an existing social. The prog triggers if the player targets the mobile with that social. This can give the mobile a little life by setting up reactions to players' behavior. *** rand_prog <NUMBER> The argument is a percentage chance. This trigger is checked at each PULSE_MOBILE. It will only trigger if there are players in the same area as the mob, to cut down on lag. It is useful to give mobiles a bit of a personality. For instance a janitor who stops to spit tobacco, or complain about the hours, or wonder why there are no woman janitors on muds, or a fido which barks or growls or pees on the curb is much more alive than one which just sits there scavenging. If the $r Variable is used in the body of the trigger the trigger will only execute if there is a player in the room. To allow a mobile to work with both $r and without players in the room use 1 rand_prog having the $r part, and one rand_prog or a time_prog taking care of other stuff. Only 1 rand_prog can trigger at each time. *** repop_prog <NUMBER> The argument is a percentage chance. This trigger is checked any time a mobile resets. One possible use is to give mobiles an echo using a repop prog, to give a more rational reason for its reappearance than simply reappearing where the original mob was killed upon repop. It could also be used to give a nasty surprize to a player who was hanging around waiting for another go at a mobile by making the mobile do something unexpected. *** time_prog <NUMBER> day_prog <NUMBER> month_prog <NUMBER> The argument is a number betweeen 0 and 24 for time_prog, between 0 and 30 for day_prog, and between 0 and 12 for month_prog. This trigger is checked at the turn of each hour, day, and month, respectively and if the argument equals the turn, the program activates. It is useful for events that happen on a regular interval, such as seasons changing, or the changing of the guard at a certain time every day. Using the highest number of the range, 24 for time, 30 for day, or 24 for month, will activate the program on every hour, day, or month. Time progs trigger whether or not any players are in the room or area with the mobile, so it is handy for using mobiles to control the environment. *** fight_prog <NUMBER> The argument is a percentage. Useful for giving mobiles combat attitude. It is checked at the beginning of every mobile's turn. Can be used to cast spells, curse at the opponent, or whatever. Only the first successful one will be processed to save time. Also, this means that the mobile wont get lucky and 1. curse, cast a fireball and 2. spit on the player, cast another fireball in the same turn. Mobiles with a fight prog do NOT act according to their coded AI on any turn that a fight_prog is triggered either, to again avoid stacking attacks. *** hitprcnt_prog <NUMBER> The argument is a percentage. Is activated at the beginning of the mobile's turn only when the mobile is fighting. It checks to see if the hitpoints of the mobile are below the given percentage. Multiple hitprcnt_progs should be listed in increasing order of percent since a 40% will always be activated before a 20% and, only the first successful hitprcnt trigger is performed. *** desc_prog <NUMBER> The argument is a percentage. Whenever someone looks at the mobile or object with the prog, it triggers. This can be used to give a random desc to something or someone, or to trigger a reaction, or other possibilities. Note that a desc prog, when triggered, interrupts the normal desc for the target being looked at. So plan accordingly with echoes and what have you to mimic a worded description. *** get_prog <NUMBER> drop_prog <NUMBER> Again a percentage argument. Only settable on objects, these progs trigger when an object is either picked up, or dropped. *** wear_prog <NUMBER> Again a percentage argument. Triggers when the object with the prog is worn, held or wielded. *** use_prog <NUMBER> Again a percentage argument. Triggers on an object when activated with the USE command. This basically allows you to create a plethora of trigger-use items beyond the typical wand, staff or whatever. Note a use_prog overrides any other result of the USE command, so it's best to use it on objects that don't already have a function triggered by the command. *** trap_prog <NUMBER> Again a percentage argument. This can be set upon a mobile or object that's summoned by a trap using the TRAP_TYPE_MLOAD or TRAP_TYPE_OLOAD flags. The combination of this flag and the mob prog trigger can make for very elaborate and complex traps and trap effects. *** greet_prog <NUMBER> Again a percentage argument. Whenever someone enters the room with the mobile, and the mobile saw the person enter, this is checked. Good for shopkeepers who want to welcome customers, or for pseudo-aggressive mobiles which need to discriminate on who they attack. *** do_greet_prog <NUMBER> Again a percentage argument. Like greet_prog, but it triggers when the player uses the GREET command upon a mobile. This effectively restricts the trigger to someone actively trying to interact with the mobile. This is quite shamelessly borrowed from the cues of online games with NPCs that trigger when interacted with. Good for shop merchants, quest givers and the like. *** group_greet_prog <NUMBER> Again a percentage argument. Like greet_prog, but it only triggers once for an entire group when they enter the room at the same time. Much better for quest mobiles during group adventures, as the mobile doesn't spam the same statement to every player in the group. *** entry_prog <NUMBER> Again a percentage argument. The opposite of a greet_prog. Whenver the mobile itself enters a new room, this can be triggered. Useful for looking around, or waving or other things that real PCs do when they arrive at a crowded room. Only the first successful one of these is done so the mobile doesnt look stupid by repeating commands resulting from multiple MOBprograms. *** exit_prog [dir] Argument is an optional direction. The reverse of greet_prog. Triggers when a player leaves the mobile or room with the prog. Adding an optional direction will trigger the prog only when the player leaves by that direction. *** arrival_prog <NUMBER> Argument is a room vnum. Triggered when a mobile enters the final room after doing MPWALKTO, and also when arriving back at it's reset room. If the check matches the vnum of the room presently in, the program activates. *** give_prog <ARGUMENT> On a mobile, the argument is the number of an object in 'I' format. Example: >give_prog I9720~ This is triggered whenever something is given to the mobile. Note the code as of Mud20 has been revised so that any mobile that doesn't trigger with a give prog gives any item back to the giver. This avoids accidental loss of items from giving the wrong item to a mobile. On an object, the argument is a percentage. This is triggered whenever the object with the prog is given to someone else. *** sac_prog <NUMBER> Argument is a percentage. Triggered when the object with the prog is sacrificed. *** bribe_prog <NUMBER> The argument is any positive integer number. This trigger is activated whenever money is given to the mobile. If the amount given exceeds the number, then process the commands. Note again, that an argument of '1' would act as a default response. Values are in copper, so don't forget to multiply higher coin amounts. You can run multiple bribe progs on a single mobile, but only the first successful prog runs when triggered. Because of this, you should list your bribe progs from largest amount to smallest, so that it keeps passing the amount down the line until it triggers a prog. *** death_prog <NUMBER> The argument is a percent once again. When the mobile dies, if the random percentage is less than the argument the mobile performs the MOBprogram commands rather than the usual death_cry sequence. This is done before the corpse is made, so the commands can be considered the mobiles last gasp. It could perhaps destroy the items it was holding, or create some, or cast a spell on the killer and the room, or even goto a new location and die there (with a text message, the corpse would seem to vanish). The position of the mobile is set to STANDING, and so it can do all the normal commands, without worrying about being DEAD. However, even if the mobile restores itself to full hitpoints, it will still die. This is not a way to immortal mobiles. However, the last thing this mobile does could be to load a fresh version of itself, give all items to the new mob and force it to wear them, then have the new mob attack and mppurge self to disappear without leaving a corpse. (Note that a kitten could turn into a dragon this way too). *** range_prog <number> The argument is a number between 1 and 100, but does nothing atm, might be a percentage in the future. The range_prog is triggered if the mobile is shot by a range weapon. The program can then check the shotfrom ($i) ifcheck to see which direction the shot came from. Note that the first successful bribe_prog, give_prog, hitprcnt_prog, death_prog, fight_prog, rand_prog and entry_prog is the only one which is executed. All the successful greet_progs, speech_progs, and act_progs will be done. This is the best arrangement we found for handling situations where you imported several MOBprogram files for a mobile. If you are going to write lots of little files and piece them together to create the effect you want, it is advisible to not mix things together all that much, otherwise you have to pay close attention to the order in which the programs are added to the link list. You should avoid using triggers of the same type at all times, except for the $r situation, and hitprcnt_prog. When using hitprcnt_prog do not use a fight_prog unless you want both the fight and hitprcnt_prog to trigger in the same combat round. Also, no MOBprograms will be successful when the mobile is charmed or possessed to protect mobiles which are given special powers from being pimped by players. ----------------------------------Variables------------------------------------ To make things come alive, variables are needed. These are represented in the MOBprograms by using a dollar sign convention as in the socials. When the mud command is processed, these variables are expanded into the values shown below. Usually, it is best to use the short descriptions of mobiles and the names of players when speaking them, but if you are performing an action to someone almost always you want the name. The title field for players is an extra that probably wont often be used. Without further hesitation... the variables: $i the first word of the name of the mobile $I the short description of $i $n the name of the one who caused the trigger to happen $N the short description of $n $t the name of a secondary player target (example: $n smiles at $t) $T the short description of $t $r the name of a random player in the room $R the short description of $r $e he,she,it based on sex of $n $m him,her,it based on sex of $n $s his,hers,its based on sex of $n $j he,she,it based on sex of $i $k him,her,it based on sex of $i $l his,hers,its based on sex of $i $E he,she,it based on sex of $t $M him,her,it based on sex of $t $S his,hers,its based on sex of $t $J he,she,it based on sex of $r $K him,her,it based on sex of $r $L his,hers,its based on sex of $r $o the name of the primary object (selected in give_progs) $O the short description of $o $p the name of the secondary object (example $n puts $o in $p) $P the short description of $p $c the name of a carried object (select with hasobjnum check) $C the short description of $c $a a,an based on name of $o $A a,an based on name of $p $1..$9 Corresponding word in the trigger phrase Also, in if_checks, the accepted variables are the basic ones (i,n,t,r). If a variable is referenced that doesnt exist, then the value is simply left blank. (i.e referring to $o when the trigger is: A kisses B) The only problem with the variables is that the secondary object and the secondary target are passed by act() in the same location. This means that if you reference $t in an A puts B in C situation, the result will probably be a wierd log file spam, espescially if $t is used in an if_check (if isnpc ($t) or something) The basic fix is to write the act_program such way that it can hardly go wrong for a very specific situation. Example: >act_prog p gives a stone of power to~ $n is the one giving the stone. $t is the one receiving the stone. $O is the short description of the stone. You'll hardly need $o and $p though. $c and $C are very useful to store the name of a player so the mobile can refer to it later on. ------------------------------Control Flow Syntax------------------------------ In place of any legal mud command in a MOBprogram, one can substitute a flow of control command. Here is the syntax for a flow of control command. "if" " " {if_check_1} "(" {argument} ")" [ {operator} {value} ] NL "or" " " {if_check_2} "(" {argument} ")" [ {operator} {value} ] NL ] . . . "or" " " {if_check_N} "(" {argument} ")" [ {operator} {value} ] NL ] [ {program_command_1} NL ] [ {program_command_2} NL ] . . . [ "break" NL ] . . . [ {program_command_N} NL ] [ "else" NL ] [ {program_command_1} NL ] [ {program_command_2} NL ] . . . [ "break" NL ] . . . [ {program_command_N} NL ] "endif" NL Basically, it is: an 'if' line, followed by zero or more 'or' lines, followed by zero or more legal mud commands, which may contain a 'break' line, possibly followed by an 'else' line , followed by zero or more legal mud commands, which may contain a 'break' line, followed by an 'endif' line. The only new syntax labels are all in the IF line: --- Explainations An IF_CHECK is a string which describes how to compare things. The ARGUMENT is the target of the check. The OPERATOR indicates how the target and value are going to be compared. The VALUE is compared depending on the given operator. The BREAK command bails out of the entire MOBprogram regardless of the level if nesting. If that looks confusing, skip to the end of the document and review the Example. Hopefully that should clear things, otherwise you'll probably have to give us a mail since examples are the best way we know to explain syntax. --------------------------------Operators----------------------------------- Most of the basic numeric operators are legal and perform the same function as in C. The string operators are a bit more confusing. There are negative versions of some of the operators. These are not strictly needed, since the if/else construct of Control Flow commands can handle either case. Numeric Operators: == != > < >= <= String Operators: == != / !/ For strings, == and != check for exact match between the two strings and the other two, / and !/ check to see if the second string is contained in the first one. This is so things like: if name($n) / guard will respond true to "cityguard" "guard" "guardian" etc. Using == on a name implies that you are matching the complete name "cityguard guard" or whatever. ------------------------If_Checks In Control Flow--------------------------- The provided list of if_checks and their arguments are below. They should all be fairly obvious in what they do, but some of the more obtuse deserve a slight explanation. Any '==' operator can be replaced with any of the available ones described above. The argument ($*) refers to any of the variables which make sense for that if_check (i.e. for an if_check which is referencing a person the only valid variables would be $i, $n, $t or $r) A value type of string is a sequence of characters. It does not need to be included in quotes or anything like that (i.e. name($n)== orc large brown) if actorhasobjnum (vNum) sets $c and $C variable if actorwearsobjnum (vNum) sets $c and $C variable if age ($*) == integer checks the age of the char if areaquest (B,N,$*) == integer B = Offset, N = Numbits for area quest bits if cansee ($*) can the mobile see $* (object or character) if cancarry ($*) can $* carry more items if cha_check ($*) == integer/$* cha check against a DC, or cha roll of $* if class ($*) == bitvector checks active class of $* if con_check ($*) == integer/$* cha check against a DC, or con roll of $* if curr_str ($*) == integer the current STR of the charater if curr_dex ($*) == integer the current DEX of the charater if curr_con ($*) == integer the current CON of the charater if curr_int ($*) == integer the current INT of the charater if curr_wis ($*) == integer the current WIS of the charater if curr_cha ($*) == integer the current CHA of the charater if existsarea (name) if existsroom (name) searches for matching object or mob if existsworld (name) if goldamt ($*) == integer if hasobj (name) sets $c and $C variable if hasobjnum (vNum) sets $c and $C variable if hitprcnt ($*) == percent Checks percentage of hitpoints left if inroom ($*) == vnum if isaffected ($*) == bitvector if isevil ($*) if isfight ($*) Is $* fighting if isfollow ($*) Is $* a follower with master in same room if isgood ($*) if iskiller ($*) if isneutral ($*) if isnpc ($*) Hardly used since most triggers only work on players if ispc ($*) if isthief ($*) if level ($*) == integer if name ($*) == string if number ($*) == integer Is the vnum of $* equal to integer if number ($*) == integer Is the vnum of $* equal to integer if objquest (B,N,$*) == integer if objtype ($*) == bitvector if objtype ($*) == bitvector if objval0 ($*) == integer if objval0 ($*) == integer if objval1 ($*) == integer if objval1 ($*) == integer if objval2 ($*) == integer if objval2 ($*) == integer if objval3 ($*) == integer if objval3 ($*) == integer if pcsinarea ([vnum]) == integer if pcsinroom () == integer if position ($*) == bitvector if quest (B,N,$*) == integer B = Offset, N = Numbits, R = Room vnum if questr (R,B,N,$*) == integer if race ($*) == bitvector if rand (number) Is rand percentage less or equal to number if sex ($*) == bitvector if shotfrom ($i) == string Used for range_prog if skilllevel ('skill name',$*) == integer checks the ranks in the given skill if time () == integer if whichgod ($*) == bitvector Skill if checks These are worthy enough to have a basic explanation of their own. These if checks use the OGS d20 mechanic to make skill checks for each of the applicable skills. In some cases, this check MUST me done against a DC, and this is specified by <integer> after the operator. Some checks will allow an opposing character, indicated by <integer/$*>. When this is the case, you may use a target argument instead, and the skill check will use the opposing roll of the opponent character. In rare instances, a certain skill check may require ONLY an opponent, thus indicated by <$*> alone. Note these checks only work with the operators == or >= (meaning the check succeeded) or < or != (meaning the check failed) if balance_check ($*) == integer if bluff_check ($*) == integer/$* vs. sense motive of $* if climb_check ($*) == integer if concentration_check ($*) == integer ------------------------MOBCommands Of Interest----------------------------- These are fairly basic things, most of them are wiz commands which have been changed to allow for mobiles to perform the commands. If you have the problem of immortals abusing these powers on your mud either ditch the immortals, or add a check in all of them to only let NPC's with null descriptors do the commands. (However, you lose a little debugging help that way). Emud has provided a little security feature against this but it is by no means comprehensive. Please check yourself if you are concerned. *** Important: Since many items have the same name for keywords, it is required for area creators to use the I#### system for such things as give_prog. This uses the object number with an 'I'. This method allows exact procedures of handling objects in mob_progs. This system is added to all item keywords, so it is not necessary to add them to each item keyword list. Here are the basic MOBcommands that we found to be enticing: *** PEACE This command comes in handy to stop a fight. It also clears the hunting, hating, and fearing flags that might be upon a mobile. *** SLAY <victim> This command simply kills the victim, this cannot be 'self'. When a player is slayed they will not lose exp or have a death added. *** QUIT When this command is executed by a mobile it will instantly die, leaving a corpse. *** RESETAREA resetarea will result in an instant repop of the area the mobile is in. *** MPROG <mobile> Shows the MOBprograms which are set on the mob of the given name or vnum and some basic stats for the mobile *** MPASOUND <text_string> Prints the text string to the rooms around the mobile in the same manner as a death cry. This is really useful for powerful aggressives and is also nice for wandering minstrels or mobiles like that in concept. *** MPECHO <text_string> MPECHOAT <victim> <text_string> MPECHOAROUND <victim> <text_string> MPAREAECHO <text_string> Prints the text message to the room of the mobile. Colors can be used. When executed by a player: $n will print the name of the executer. $e $s $m will show sex related stuff of the executer. When executed by a mobile program: See list with variables, they will work as described. *** MPJUNK <object> Destroys the object refered to in the mobiles inven. It prints no message to the world and you can do mpjunk all to junk every item carried AND worn by the mobile in one time. *** MPJUNKPERSON <victim> <object> Works like MPJUNK, but is targeted to another mobile or player. Can be a very nasty thing to do. *** MPMLOAD <mobile vnum> MPOLOAD <object vnum> Loads the obj/mobile into the inven/room of the mobile. If the item is non-takable it will drop to the ground unseen. This lets a mobile distribute a quest item or load a key or something. Being an area quest orientated mud we don't make a problem out of loading, where other muds might. *** MPKILL <victim> Lets a mobile kill a player. Lots of MOBprograms end up with mpkill $n commands floating around. It works on both mobiles and players. *** MPDO <argument> Allows a mobile to do the specified command, regardless of trust or level. Note this is a very powerful command, and it only work for a mobile, not even an immortal can use it. *** MPUNINTERCEPT Use this command within an intercept prog to pass the player's command after processing the trigger. Without this command, the player's command will not happen. *** MPPURGE <all|area|argument> Destroys the argument from the room of the mobile. With the 'all' argument the result is the cleansing of all NPC's and items from the room with the exception of the mobile itself. However, mppurge self will indeed purge the mobile, but it MUST be the last command the mobile tries to do, otherwise the mud cant reference the acting mobile trying to do the commands and crash will happen. There are situations where this comes unwanted. Simply add a 'break' after the mppurge self , it will stop the program and the break itself won't cause any errors. mppurge area, will purges everything in the area, except the mob purging it. *** MPQUIET < 'ON', 'OFF'> This command stops ALL forms of out output data from reaching anyone. This command can be only used inside of mob_progs, and should not be used in obj_progs at any time (it will not work regardless). Simply issue 'mpquiet on' to make all commands quiet. The mob_prog will always reset it to 'off' regardless is the programmer calls the 'off'. This command could be used to simulate a snake biting, when it is actually casting 'poison'. Simply mpecho the bite, then turn MPQUIET ON and do the casting. *** MPGOTO <dest> Moves the mobile to the room or mobile or object requested. It makes no message of its departure or of its entrance, so these must be supplied with mpecho commands if they are desired. *** MPAT <dest> <command> Perfoms the command at the designated location. The destination can be an object, room or player/mob. It mainly saves some coding work since you won't need the mob to mpgoto <destination> + command + mpgoto <where mob came from> to get stuff done. *** MPPRACTICE <victim> <skill> <max> This trains the victim up 1 point in the given skill. MAX is the maximum rank the command will train up to. As coded, this command only works for knowledge and trade skills, and the player is still subject to his max ranks for the given skill. This does not cost the player a skill point. Only a mobile can issue this command. *** MPSETFEAT <victim> <feat> [ignore] MPCLEARFEAT <victim> <feat> MPSETFEAT sets a victim to have the named feat. MPCLEARFEAT removes it. The target must still spend a feat point to have a feat set, and must have the prerequisites for the feat unless the IGNORE argument is added. MPCLEARFEAT will reimburse the feat points for the feat reset. *** MPFOLLOW <victim> Makes the mobile both follow the victim, and join his group. *** MPTRANSFER [<victim>, 'all', 'pcs'] [dest] Sends the victim to the destination or to the room of the mobile as a default. if the victim is "all" then all the characters in the room of the mobile are transfered to the destination. Good for starting quests or things like that. There is no message given to the player that it has been transfered and the player doesnt do a look at the new room unless the mob forces them to. The mobile MUST be in the same room as the character being transfered before the transfer will take place. Please note that the use of "all" includes mobiles except one issuing the command. Use "pcs" to transfer all players and pets. Try to use "pcs" as much as possible, unless you want to transfer mobs. *** MPFORCE <victim, all> <command> Forces the victim to do the designated command. The victim is not told that they are forced, they just do the command, mpquiet is oftenly used here so the player isn't aware when you force them to remove all there gear and sac it in a very naughty program. Again, if the victim is "all" then everyone in the mobiles room does the command. *** MPWALKTO <room vnum> Sets the mobile walking to the point specified. Note that if it is a mobile flagged ACT_SENTINEL and is loaded in a reset, it will end up walking back to its reset location, so long as it is awake and standing. So make sure the program does whatever else is needed to WAKE it or make it STAND. The mobile will take the most direct route, not opening doors or other obstacles. So if it cannot actually arrive at the location, it will ultimately time out. *** MPLOG <text_string> Works like MPECHO, but prints the string to the log file, and echoes it on the log channel. Handy for events you want logged, like a certain mobile getting attacked, or a player completing a certain quest, etc. *** MPDELAY <$target|self> <time> [$actor] Sets a delay on the mobile for triggering a delay_prog. This can be used to simulate a lag in an action. The first program sets the delay using mpdelay, and then a delay_prog continues the action once the delay time expires. If the mobile sets qbits upon itself, it can even make longer multiple paused actions, simply mpdelaying itself at the end of each stage, and the delay_prog processing the qbit as conditions to know what to do next. *** MPTRIGGER <$target> <word list> This command allows one mobile to communicate with another, and trigger the second mobiles actions if it has a trigger_prog set on it. Use it to command other mobiles, set up a conversation between two mobiles, or other possibiliies. *** MPMSET <victim> <field> <value> *** MPMSET <victim> <string> <argument> Allows the mobile to set any field of a player or mobile, just like an immortal can do using MSET. quest, questr, randquest, randquestr have additional parameters: mpmset <victim> quest <firstBit> <numBits> <newValue> mpmset <victim> questr <areaVnum> <firstBit> <numBits> <newValue> mpmset <victim> randquest <firstBit> <numBits> mpmset <victim> randquestr <areaVnum> <firstBit> <numBits> To reset a mobile's desc string to the original, simply use null as the argument. Example: mpmset $n long There is a small boy here. (disguise the mobile as a small boy) mpmset $n long null (returns the mobile to normal) *** MPMADD <victim> <field> <value> Allows the mobile to set any field of a player or mobile, just like an immortal can do using MADD. The main difference between MPMSET and MPMADD is that MPMADD adds the value to the current one, rather than overwriting it for a new value. quest and questr have additional parameters: mpmadd <victim> quest <firstBit> <numBits> <value> mpmadd <victim> questr <areaVnum> <firstBit> <numBits> <value> *** MPOSET <object> <field> <argument> *** MPOSET <object> <string> <argument> Allows the mobile to set any field of an object, just like an immortal can do using OSET. quest and randquest have additional parameters: mposet <object> quest <firstBit> <numBits> <newValue> mposet <object> randquest <firstBit> <numBits> *** MPOADD <object> <field> <argument> Allows the mobile to set any field of an object, just like an immortal can do using OADD. The main difference between MPOSET and MPOADD is that MPMODD adds the value to the current one, rather than overwriting it for a new value. quest has additional parameters: mpoadd <object> quest <firstBit> <numBits> <value> *** MPASET <object> <location> <value> Location can be any of the multitude of effect apply locations. This command allows you to permanently add affects to objects. *** MPZSET <field> <argument> Field being one of: resetmsg, quest quest has additional parameters: mpzset quest <firstBit> <numBits> <newValue> This allows you to make semi-persistent changes in an area. You can change the reset message for the area, and you can also set quest bits on the area. Programs in the area's objects, mobiles, etc, can then read the area quest bits to alter their behavior. Changes made of course, only persist until the next reboot, unless you save the area first. MPSAVEAREA may be an upcoming command to make such changes permanent. *** MPDAMAGE <$target|all|pcs|foe> <numdice> <sizedice> <damtype> <argument> Damtype being one of the following: pierce slash bash acid cold electric fire sonic divine force Damages the specified target(s) with the specified damage type. Victims get no save, no defense, though resistances to damage types do apply. Targeting ALL affects both mobiles and players. PCs affects only players. FOE targets someone the mobile is fighting. *** MPGORAND <firstroom> <lastroom> <offset> <skipsize> say, you have a 4x4 area from room #6400 to #6415 arranged like: 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 mpgorand 6400 6415 0 4 would put the mobile in 1 of the the following rooms: 6400 6404 6408 6412 mpgorand 6400 6415 3 4 would put the mobile in 1 of the the following rooms: 6403 6407 6411 6415 *** MAZE <X size> <Y size> <Z size> <Character Name> This command takes an area that already exists, and redefines the exits into a random pattern. This can be used to create mazes that change during game play. This command is very slow, so use with caution. The maze that is created has absolutely no connections to the rest of the world, so the use of "connect", "doorset" and "key" may be required to link the area to the rest of the game. <? size> defines the dimensions of the maze. <Character Name> defines what the seed number will be. Seed number is a value that determines how the maze will be generated. The use of the same seed on a maze with the same dimensions will always generate the same maze. Therefore individuals will always see the same maze, but it will be different between individuals. Example: maze 3 2 4 $n Creates a maze that has 24 rooms, with a seed based on $n's vnum. NOTE: The name is a good place for '$n' of the mob_progs. *** CONNECT <direction> <roomVnum> [both] This command creates a hallway in one direction from the current room to the room described in the destination. <direction> defines which door the exit is generated at. Use: north, east, south, west, up, down <roomVnum> defines the number of the room connecting to. Use a destination number of "-1" to create a wall, and disconnect a room. [both] is an optional parameter that creates a bi-directional hallway. Without this option, the hallway created it totaly one-way. Example: connect north 9755 up Creates a connection between the current room and roterodamum square. Usage: An interesting use for this command is to temporarily create a door that did not previously exist, and force a party through it, then use the connect command again to remove the newly created eixt. *** DOORSET <direction> <doorflag> <doorname> The doorflag must have a value between 0 and 47 (needs an update we know) The doorname will automatically become the exit description Every key with value0 being 0 will unlock the created door Current plans will result in the following change in the future: doorset <direction> <field> <argument> Field being one of: name desc flag key This command places a door between two connected rooms. These rooms need not be connected through the "connect" command. If you are using the "connect" command, be sure to connect both sides, since the "connect" command only works in one direction. The door command only works if both exits on the two rooms are going in opposite directions, to the other room, which is a standard hallway. <direction> defines which door the exit is generated at. Use: north, east, south, west, up, down <flag> is the door flag: 0 - no door 1 - door 2 - closed 4 - locked 8 - hidden 32 - pickproof 64 - bashproof 128 - magicproof Example: These are for the future version of doorset: doorset north name gate (sets the keyword of the door to: gate) doorset north desc You see heavy iron gates blocking your path. (sets the exit description) doorset north flag 167 (sets exit flags to: magicproof, pickproof, locked, closed, door) doorset north key 3714 (the door can be unlocked by the item with vnum 3714, the key from the tower of training in this case) *** RESCALE <mobVnum> <target> <percentage> The level, damage, and hitpoints of the mobile will be rescaled Formula: newLevel = mobLevel * targetLevel/100 * percentage/100 *** PURGE AREA This command is a modified form of MPPURGE, called by "purge area". When used it scans every room in an entire area, and purges it of items and mobiles. *** MPSWAP <direction1> <direction2> This command will swap the given directions. It works easier than disconnecting and reconnecting exits, and should be useful if you want to create your own mazes. --------------------------Regarding CPU Slowdown------------------------------- We have no real idea how slow this makes a mud. However, you will find that if you are judicious with your use of MOBprograms, you can either do little damage, or even reduce the effort on your server! This means that mobile rand_progs shouldn't be used when a time_prog will do just as well. (A time prog is checked once a mud day, which is about once every 1 minuts, instead of every second) Include proper if checks to avoid too much code needing execution. Include a $r if the program only needs execution with a player being in the same room. Try to keep the percentage low when the rand prog is just for fun and isn't required for good functioning of the quest. Emud systems can track the average speed for various functions. Mobile programs rank as one of the top 3 functions, and eat up about 25% of the total cpu usage for the entire game. Although this is a general game-wide value, it gives an idea of the complexity of the mob_prog system. Even though computer hardware gets better and better it's still a good habbit to make your programs as cpu friendly as possible. -------------------------Miscellaneous Information----------------------------- There is really no limit to the number of MOBprograms a given mobile can have. However, the length of a single command block is limited by the value of MAX_STRING_LENGTH. In my version it was around 22k, so that is probably about 500 lines. The indentation spaces shown in the example make it easier to read (and debug), and since your programs will be checked by an admin it would be wise to use them. The MOBprogram stuff runs totally without anything in the mob_commands.c file, but letting mobiles be a bit more godlike has allowed us to do what we consider to be wonderful things. The replicant and polymorphing mobiles described above as well as some nifty mob helping mob interactions are an example. It IS possible to accidentally make mobiles which can trigger in loops. As mentioned in the example at the end of this document, the result is usually a mud crash or major CPU dent. We dont know any way to prevent this from happening, other than careful coding and a restriction of mobile travel from zones of one creator to another (another good reason to not have charmed mobiles do anything). Tracking down the culprit mobile is not always easy. The only thing we have found which always works, is to add a log statement into the MOBprogram driver and fill some disk space until it becomes apparent what commands are repetitively issued. Also, most infinite loops are flukes where the situation just happens to be right and usually it never happens again. Another common problem is mobiles that load other mobiles for various reasons. This may seem innoculous, until the loaded mobile decides to load another mobile. It has been seen that some areas, over the course of time can develope thousands of mobiles, which slow down the cpu drastically, not to mention the drain on system resources, such as RAM. Be very careful that you know the exact situation before mpmloading another mobile. The list of variables and triggers and if_checks will grow continuously as our creators demand the ability to do certain things. If you have a request or if you have a new one, we don't mind hearing about them, and if you find bugs, we shall gladly attempt to squash them for you. As additions or fixes are made, the code will occasionally be redistributed. However, if you want a current version, please feel free to ask. When the code is redistributed, a file containing the change history from the original release will be provided (when possible) to allow you to patch in the changes with low grief. *** Note about testing: All area creators are required to test their area thoroughly before it is included in the working game. This is usually done on a test game, where the implementors of the working game run the test game on a part-time basis. Special note should be taken on all mob_progs, and obj_progs. It is absolutely required that all cases of a program must be tested, even if it is a simple failure to break. It is much better to find program bugs in the test game then in the working game. ----------------------------------Credits----------------------------------- The reason this code was written was to enhance the playing experience at ThePrincedom (a Merc 2.0 based world scheduled to open in October 1993) The original idea for this type of MOBprogram came from playing on: WORLDS of CARNAGE, a dikumud implemented by Robbie Roberts and Aaron Buhr. Aaron (known as Dimwit Flathead the First) was the original author from what I have been told, and I hope he will not be totally offended and angered by my coding and sharing a mimicked version with the world. This version is probably not as good as the original and I do feel remorse for publishing the idea. However, since Carnage has been down for months without a word of information regarding its return, I am glad to let one of the best features live on in future generations of MUDs. There are no objections to this code being shared, since, aside from a nuclear destruction of all the Temples of Midgaard (excepting the original one!!), bland mobiles are the greatest bane of Dikumuds today. It would be nice to get a message saying you are using the code just for our references. We shant answer questions from anyone until told where they are using the code. *grin* Since this code is not copyrighted, you of course dont have to do anything we say, but it would be nice of you to put the mobprog help screen into your database. and have mobinfo show up somewhere on a more visable help screen (possibly tagged onto the bottom of credits as a see also...) I acknowledge all the work done by the original Diku authors as well as those at Merc Industries and appreciate their willingness to share code. Also, quick thanks to Wraith for doing a little beta-installation testing. N'Atas-Ha June, 1993 murph@ri.cmu.edu In addition to this DOC file credit section, I'd like to add a thank you to Yaz, Mahatma, Zelda, and the rest of the Marble Mud crew for extensively testing MOBProgram 2.1 for me. You may see MOBPrograms in action as well as their own "flavor" of mud at marble.bu.edu 4000. Kahn Oct 28th, 1993 MERC Industries {+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+}+{+} Just a tasteless gloating statement by Chaos: A major advancement to the operation of mob_progs was introduced October of 1995. This major advancement is the tokenizing of mob_progs. The original code was a simple system that parsed the code for the $n stuff and shoved the result into the interp routine. This is the same interp routine that players use to decipher commands. The interp routine is relatively slow, and the mob_prog parser is quite slow itself. The basis of the tokenizer is that a mob_prog will not change, once the mud itself has started up, so why parse and interperet it with every execution of a mob_prog? The basic system parses and interperets the mob_progs at boot time. During the execution of a mob_prog, the entire program is made up of pointers to tokens, or blocks of binary (not ascii) data. Execution time is improved significantly. Additional, the wiz command mprog displays the mob_prog's input, displaying the mob_prog's output. This means that the command shows what the mud understands from the mob_prog given to it. Which is excellent for debugging. Also the TIMEMODE command in active mode will give a trace output of the mob_progs while they execute, including the mob_prog line numbers. Future efforts may give these commands to the players on the testing game. ===================CUT HERE FOR QUICK REFERENCE SHEET======================== =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= TRIGGERS ARGUMENT Explanation act_prog WORDLIST or P WORD_PHRASE to match from act() to mobile bribe_prog INTEGER amount of miminum gold amount given to mobile entry_prog PERCENT chance to check when mobile moves to a new room give_prog OBJ NAME to match when obj given to mobile greet_prog PERCENT chance to check if visable char enters mobile's room all_greet_prog PERCENT chance to check when any char enters mobile's room fight_prog PERCENT chance to check at fight_pulse if mobile is fighting hitprcnt_prog PERCENT lower than mobiles hit/max_hit if mobile is fighting death_prog PERCENT chance to check after mobile has been slain rand_prog PERCENT chance to check every game_pulse speech_prog WORDLIST or P WORD_PHRASE to match in dialogue to mobile range_prog PERCENT triggered when mobile shot time_prog HOUR triggered on given hour. (0-23) *24 is every hour =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= VARIABLES MOB ACTOR VICTIM RANDOM OBJ1 OBJ2 OBJ3 name $i $n $t $r $o $p $c short_desc $I $N $T $R $O $P $C he/she/it $j $e $E $J -- -- -- his/hers/its $k $s $S $K -- -- -- him/her/it $l $m $M $L -- -- -- a/an -- -- -- -- $a $A -- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= IFCHECKS isnpc ($*) Is $* a mob ispc ($*) Is $* a player isgood ($*) Is $* of good alignment isevil ($*) Is $* of evil alignment isneutral ($*) Is $* of neut alignment iskiller ($*) Is $* a killer isthief ($*) Is $* a thief rand (number) Is random percentage less or equal to number hasobj (name) Is the mob carrying the object: sets $c hasobjnum (vNum) Is the mob carrying the object: sets $c actorhasobjnum (vNum) Is actor carrying the object: sets $c isaffected ($*) == integer Is $* affected by spell hitprcnt ($*) == percent Is the hit/max_hit of $* equal to percent inroom ($*) == vnum Is the room of $* equal to vnumber sex ($*) == integer Is the sex of $* equal to integer position ($*) == integer Is the position of $* equal to integer level ($*) == integer Is the level of $* equal to integer class ($*) == integer Is the class of $* equal to integer race ($*) == integer Is the race of $* equal to integer whichgod ($*) == integer Is the god of $* equal to integer goldamt ($*) == integer Is the money of $* equal to integer age ($*) == integer Is the age of the player equal to integer objtype ($*) == integer Is the item type of $* equal to integer objval0 ($*) == integer Is the value equal to integer objval1 ($*) == integer Is the value equal to integer objval2 ($*) == integer Is the value equal to integer objval3 ($*) == integer Is the value equal to integer number ($*) == vNum Is the vnum of $* equal to integer name ($*) == string Is the name of $* equal to string time () == integer Is the mud time equal to integer shotfrom ($i) == integer Is the mob shot from exit equal to integer pcsinarea () == integer Is amount of PC's in area equal to integer pcsinarea (vNum) == integer Is amount of PC's in area equal to integer pcsinroom (vNum) == integer Is amount of PC's in room equal to integer quest (B,N,$*) == integer Is (startBit,range,$*) equal to integer questr(A,B,N,$*) == integer Is (area,startBit,range,$*) equal to integer objquest(B,N,$*) == integer Is (startBit,range,$*) equal to integer =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= MP-COMMANDS ARGUMENTS MP-COMMANDS ARGUMENTS MPROG <mobile> MPASOUND <text_string> MPJUNK <object> MPECHO <text_string> MPMLOAD <mobile> MPECHOAT <victim> <text_string> MPOLOAD <object> <level> MPECHOAROUND <victim> <text_string> MPKILL <victim> MPPURGE [argument] MPGOTO <dest> MPAT <dest> <command> MPTRANSFER <dest> [location] MPFORCE <victim> <command> MPMSET <mobile> <flag/string> MPOSET <object> <flag/string> MPMADD <victim> <flag> <val> MPOADD <object> <flag> <val> MPGORAND <frm> <lrm> <ofs> <skp> ======================END OF QUICK REFERENCE SHEET=========================== ++++++++++++++++++++++++++++++++EXAMPLE++++++++++++++++++++++++++++++++++++++ Referenced from above in the Control Flow section >act_prog p pokes you in the~ if isnpc ($n) chuckle poke $n else if level ($n) <= 5 or isgood ($n) tell $n I would rather you didnt poke me. else if level ($n) > 15 scream say Ya know $n. I hate being poked!!! kill $n else slap $n shout MOMMY!!! $n is poking me. endif endif endif ~ Ok.. time to translate.. the trigger will only happen when the mobile gets the message "... pokes you in the ..." If the offender (recall the $n and $N refer to the char who did the poking...) is an NPC, then the mobile merely chuckles and pokes back. If the offender was a PC then good and low level characters get a warning, high level chars get attacked, and midlevel chars get slapped and whined at. Note that two of these mobiles could easily get into an infinite poke war which slows down (or frequently crashes) the mud just a bit.. Be very careful about things like that if you can. (i.e dont respond to a poke with a poke, and try not to let heavily programmed robot mobiles wander around together. More on that is given above.) Also, it is clear that the 'order' command could get confused with the 'or' control flow. However, this is only the case when 'order' is abbreviated to its two letter form, and placed immediately following an 'if' line. Thus, if you want to be that malicious in trying to break the MOBprogram code, noone is going to stand in your way (However, the result of this would be a bug message and a bail out from the ifcheck so things dont really break) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ The following are extra examples of mob_progs. These are the running code for the area Gateway to Avernus. Use these as references for creating mob_progs. ============================================================================== #QQ19 iron golem chair~ The Iron Golem~ There is a chair here with the distinct outline of a large man.~ The Iron Golem, formerly a chair, is large and menacing. His steps echo in the room. He has a complete look of indifference in his eyes. ~ ACT_SENTINEL|ACT_SMART AFF_DETECT_INVIS|AFF_DETECT_HIDDEN 0 S 65 0 0 2d800+6000 2d5+50 0 0 POS_STANDING POS_STANDING SEX_MALE >speech_prog margoyle~ mpat QQ54 mpecho $n arrives from the infinite plains. mptransfer $n QQ54 mpecho $n is taken from the infinite plains. ~ >rand_prog 10~ if rand (50) say Hello mortal. I know how to leave the plains. else say Ask me to tell you about the stones. endif ~ >speech_prog stones~ say The stones can move, when they have life. say But the question is how do they get life? ~ >speech_prog life~ say Life can be endowed by the simplest of powers. say Even the homonculous can tell you that. mpecho The homonculous grins widely. ~ >speech_prog plains~ say The plains are infinite. ~ >speech_prog homonculous~ say The homonculous was also created by my master, say along with the other creatures, that exist behind say a set of gates. If you know who my fellow stone say creatures are, I will take you out of the plains. ~ | #QQ20 efreeti~ The Efreeti~ There is a large Efreeti here laughing deeply at you.~ The efreeti stands over twelve feet tall. Although man-like in appearance, he has two small horns sprouting out of his head. He has flames licking his body. ~ ACT_SENTINEL|ACT_SCAVENGER|ACT_AGGRESSIVE|ACT_SMART AFF_DETECT_INVIS|AFF_DETECT_HIDDEN -100 S 62 0 0 2d400+2000 2d25+25 80000 0 POS_STANDING POS_STANDING SEX_MALE >fight_prog 50~ if rand (33) cast 'energy drain' $n else if rand(50) cast 'lightening bolt' $n else cast fireball $n endif endif ~ >death_prog 100~ if questr (30900,0,3,$n) == 1 if quest (30,1,$n) == 0 mpmset $n quest 30 1 1 mpforce $n HELP GUILDTOKEN mpquiet on mpoload 30914 give i30914 $n mpquiet off endif endif ~ | #QQ12 belial devil arch~ Belial the Arch Devil~ Belial is twiddling with the ring on his finger and grinning evilly.~ With an angry glare, Belial judges you. He looks like an ebony man with small horns poking out from the top of his head. He says something to you that you don't understand. ~ ACT_SENTINEL|ACT_SCAVENGER|ACT_AGGRESSIVE|ACT_SMART AFF_DETECT_INVIS|AFF_DETECT_HIDDEN|AFF_STEALTH|AFF_TONGUES -1000 S 150 0 0 1d1+19000 4d30+90 60000 0 POS_STANDING POS_STANDING SEX_MALE >fight_prog 66~ if rand (25) mpecho {100}A black hole opens in space to admit a small devil. mpmload 4201 else if rand (33) mpecho {100}A black hole opens in space to admit a devil. mpmload 4202 else if rand (50) mpecho {100}A black hole opens in space to admit a large devil. mpmload 4211 else mpecho {100}A black hole opens in space to admit a huge devil. mpmload 4213 endif endif endif if rand (25) say You WILL die mortal! else if rand (33) cast "call lightning" $r else if rand(50) cast heal cast heal cast heal cast heal cast heal endif endif endif ~ >rand_prog 10~ mpquiet on get all remove all wear all drop all sacrifice all mpquiet off ~ | #QQ13 barbed devil~ The Barbed Devil~ There is a rather large Barbed Devil here.~ The Barbed Devil is toying with the small flame that is erupting from his hands. ~ ACT_SCAVENGER|ACT_AGGRESSIVE|ACT_SMART AFF_DETECT_INVIS|AFF_DETECT_HIDDEN -1000 S 70 0 0 2d200+2600 2d25+35 30000 0 POS_STANDING POS_STANDING SEX_NEUTRAL >fight_prog 50~ if rand (10) cast "fire breath" $n else if rand (20) mpecho The Barbed Devil cries out for help from Belial. mpecho A large opening in space appears, and a devil steps out. mpmload 4211 else kick endif endif ~ >time_prog 1~ cast 'stone skin' ~ | ============================================================================== FILE: "Mud20.txt" These are extractions from Emud, the program. So they are accurate for the time they were extracted from the program. MAX_CLASS 8 MAX_RACE 29 MAX_LEVEL 99 PULSE_PER_SECOND 4 PULSE_VIOLENCE ( 4 * PULSE_PER_SECOND) PULSE_MOBILE ( 4 * PULSE_PER_SECOND) =============================================================================== Area Flags AFLAG_NODEBUG AFLAG_NORECALL AFLAG_NOTELEPORT AFLAG_NOCASTLE AFLAG_NOGOHOME AFLAG_NORIP =============================================================================== Mobile Actions ACT_SENTINEL ACT_TRAIN ACT_NO_ORDER ACT_SCAVENGER ACT_PRACTICE ACT_BODY ACT_DRUNK ACT_WEAK ACT_RACE ACT_AGGRESSIVE ACT_SMART ACT_UNDEAD ACT_WIMPY ACT_NOCORPSE =============================================================================== Mobile Affects AFF_DETECT_HIDDEN AFF_ETHEREAL AFF_UNDERSTAND AFF_DETECT_INVIS AFF_INVISIBLE AFF_TONGUES AFF_NONE AFF_STEALTH AFF_SLEEP AFF_PROTECT_GOOD AFF_SNEAK AFF_CHARM AFF_PASS_DOOR AFF_HIDE AFF_FAERIE_FIRE AFF_FLYING AFF_HUNT AFF_POISON AFF_SANCTUARY =============================================================================== Mobile Genders SEX_NEUTRAL SEX_MALE SEX_FEMALE =============================================================================== Body Parts BODY_HEAD BODY_FOOT_2 BODY_HORN BODY_MOUTH BODY_HAND_2 BODY_CLAW_1 BODY_EYE BODY_WING BODY_HAND_1 BODY_NONE BODY_TAIL BODY_FOOT_1 BODY_NONE BODY_TENTICLE =============================================================================== Mobile Races RACE_HUMAN RACE_SPRITE RACE_PHOENIX RACE_ELF RACE_SHADE RACE_MYRDDRAAL RACE_DARKELF RACE_ROC RACE_DRAGON RACE_DWARF RACE_THREEKREEN RACE_TITAN RACE_GNOME RACE_WEREWOLF RACE_EAGLE RACE_ORC RACE_DEMON RACE_OCTOPUS RACE_GRIFFON RACE_GARGOYLE RACE_FIREDRAGON RACE_HALFELF RACE_WRAITH RACE_MINDSTALKER RACE_OGRE RACE_TROLL RACE_MULL RACE_VAMPIRE =============================================================================== Mobile Positions POS_DEAD POS_STUNNED POS_FIGHTING POS_MORTAL POS_SLEEPING POS_STANDING POS_INCAP POS_RESTING =============================================================================== Object Types ITEM_TYPE_NOTHING ITEM_TYPE_ARMOR ITEM_TYPE_FOOD ITEM_TYPE_LIGHT ITEM_TYPE_POTION ITEM_TYPE_MONEY ITEM_TYPE_SCROLL ITEM_TYPE_FURNITURE ITEM_TYPE_BOAT ITEM_TYPE_WAND ITEM_TYPE_TRASH ITEM_TYPE_FOUNTAIN ITEM_TYPE_STAFF ITEM_TYPE_CONTAINER ITEM_TYPE_PILL ITEM_TYPE_WEAPON ITEM_TYPE_DRINK_CON ITEM_TYPE_AMMO ITEM_TYPE_TREASURE ITEM_TYPE_KEY =============================================================================== Object Flags FLAG_HUM FLAG_BLESS FLAG_INVENTORY FLAG_EVIL FLAG_ANTI_NEUTRAL FLAG_LEVEL FLAG_INVIS FLAG_ANTI_GOOD FLAG_AUTO_ENGRAVE FLAG_MAGIC FLAG_ANTI_EVIL FLAG_GLOW FLAG_NODROP FLAG_NOREMOVE =============================================================================== Wear Locations CAN_WEAR_TAKE CAN_WEAR_LEGS CAN_WEAR_ABOUT CAN_WEAR_FINGER CAN_WEAR_FEET CAN_WEAR_WAIST CAN_WEAR_NECK CAN_WEAR_HANDS CAN_WEAR_WRIST CAN_WEAR_BODY CAN_WEAR_ARMS CAN_WEAR_WIELD CAN_WEAR_HEAD CAN_WEAR_SHIELD CAN_WEAR_HOLD =============================================================================== Object Applies APPLY_STR APPLY_MANA APPLY_SAVING_PARA APPLY_DEX APPLY_HIT APPLY_SAVING_ROD APPLY_INT APPLY_MOVE APPLY_SAVING_PETRI APPLY_WIS APPLY_AC_ENHANCE APPLY_SAVING_BREATH APPLY_CON APPLY_HITROLL APPLY_SAVING_SPELL APPLY_SEX APPLY_DAMROLL =============================================================================== Object Classes FLAG_CLASS_FIGHTER FLAG_CLASS_MONK FLAG_CLASS_CLERIC FLAG_CLASS_RANGER FLAG_CLASS_DRUID FLAG_CLASS_WIZARD FLAG_CLASS_ROGUE FLAG_CLASS_BARD =============================================================================== Containers CONT_CLOSEABLE CONT_PICKPROOF CONT_CLOSED CONT_LOCKED =============================================================================== Drink Containers LIQ_WATER LIQ_LEMONADE LIQ_COFFE LIQ_BEER LIQ_FIREBRT LIQ_BLOOD LIQ_WINE LIQ_LOCALSPC LIQ_SALTWATER LIQ_ALE LIQ_SLIME LIQ_COKE LIQ_DARKALE LIQ_MILK LIQ_WHISKY LIQ_TEA =============================================================================== Weapons WEAPON_SLICE WEAPON_CLAW WEAPON_GREP WEAPON_STAB WEAPON_BLAST WEAPON_BITE WEAPON_SLASH WEAPON_POUND WEAPON_PIERCE WEAPON_WHIP WEAPON_CRUSH =============================================================================== Room Flags ROOM_DARK ROOM_PRIVATE ROOM_NO_MOB ROOM_FOG ROOM_SOLITARY ROOM_NO_ASTRAL ROOM_INDOORS ROOM_ALLOW_FTR ROOM_NO_RECALL ROOM_SAFE ROOM_ALLOW_BAR ROOM_NO_SAVE ROOM_BANK ROOM_ALLOW_ROG ROOM_NO_CASTLE ROOM_PET_SHOP ROOM_ALLOW_MNK ROOM_NO_RIP ROOM_MORGUE ROOM_ALLOW_DRU ROOM_ALTAR_N ROOM_ALLOW_SOR ROOM_NOTE_BOARD ROOM_ALLOW_CLE ROOM_BLOCK ROOM_ALLOW_WIZ =============================================================================== Room Sectors SECT_INSIDE SECT_WATER_NOSWIM SECT_ASTRAL SECT_CITY SECT_UNUSED SECT_UNDER_WATER SECT_FIELD SECT_AIR SECT_UNDER_GROUND SECT_FOREST SECT_DESERT SECT_DEEP_EARTH SECT_HILLS SECT_LAVA SECT_MOUNTAIN SECT_INN SECT_WATER_SWIM SECT_ETHEREAL =============================================================================== Exit Directions DIR_NORTH DIR_EAST DIR_SOUTH DIR_WEST DIR_UP DIR_DOWN =============================================================================== Door Flags EX_ISDOOR EX_HIDDEN EX_MAGIC_PROOF EX_CLOSED EX_PICKPROOF EX_LOCKED EX_BASHPROOF =============================================================================== Door Reset Flags DOOR_OPEN DOOR_CLOSED DOOR_CLOSED_LOCKED =============================================================================== Reset Wear Locations WEAR_NONE WEAR_HEAD WEAR_WAIST WEAR_LIGHT WEAR_LEGS WEAR_WRIST_L WEAR_FINGER_L WEAR_FEET WEAR_WRIST_R WEAR_FINGER_R WEAR_HANDS WEAR_WIELD WEAR_NECK_A WEAR_ARMS WEAR_HOLD WEAR_NECK_B WEAR_SHIELD WEAR_BODY WEAR_ABOUT =============================================================================== Conditions COND_DRUNK COND_FULL COND_THIRST =============================================================================== God Flags GOD_NEUTRAL GOD_MANWE GOD_AQUARIUS GOD_DEMISE GOD_HYPNOS GOD_GAIA =============================================================================== Class Flags CLASS_FIGHTER CLASS_MONK CLASS_WIZARD CLASS_RANGER CLASS_DRUID CLASS_ROGUE CLASS_BARD =============================================================================== Values for items value0, value1, value2, value3 ITEM_LIGHT Value[0]: - Value[1]: - Value[2]: Number of hours the light can be used for. Value[3]: - ITEM_SCROLL Value[0]: Level of the spell on the scroll. Value[1]: Which spell Value[2]: Which spell Value[3]: Which spell ITEM_WAND Value[0]: Level of spell in wand. Value[1]: Max Charges Value[2]: Charges Left Value[3]: Which spell in wand ITEM_STAFF Value[0]: Level of spell in staff. Value[1]: Max Charges Value[2]: Charges Left Value[3]: Which spell in staff ITEM_WEAPON Value[0]: Type of ammo shot by the weapon Value[1]: Number of dice to roll for damage Value[2]: Size of dice to roll for damage Value[3]: The weapon type. ITEM_TREASURE Value[0]: - Value[1]: - Value[2]: - Value[3]: - ITEM_ARMOR Value[0]: The effective AC Value[1]: - Value[2]: - Value[3]: - ITEM_POTION Value[0]: Level of the spell in the potion. Value[1]: Which spell Value[2]: Which spell Value[3]: Which spell ITEM_FURNITURE Value[0]: - Value[1]: - Value[2]: - Value[3]: - ITEM_TRASH Value[0]: - Value[1]: - Value[2]: - Value[3]: - ITEM_CONTAINER Value[0]: Maximum weight the container can contain. Value[1]: Container flags Value[2]: key vnum. -1 means no lockability. Value[3]: 0 ITEM_DRINKCON Value[0]: Maximum drink-units the drink-container can contain. Value[1]: Number of drink-units that are left in the container. Value[2]: The type of liquid in the drink-container Value[3]: if this value is non-zero, then the drink is poisoned. ITEM_KEY Value[0]: The key-type. Must match lock type. Value[1]: - Value[2]: - Value[3]: - ITEM_FOOD Value[0]: The number of hours, that this food will fill the stomach Value[1]: - Value[2]: - Value[3]: If this value is non-zero, the food is poisoned. ITEM_MONEY Value[0]: The number of gold coins "in the pile of coins". Value[1]: - Value[2]: - Value[3]: - ITEM_BOAT Value[0]: - Value[1]: - Value[2]: - Value[3]: - ITEM_FOUNTAIN Value[0]: - Value[1]: - Value[2]: - Value[3]: - ITEM_PILL Value[0]: Level of the spell in the potion. Value[1]: Which spell Value[2]: Which spell Value[3]: Which spell ITEM_AMMO Value[0]: Ammunition type Value[1]: Damage Value[2]: Speed Value[3]: Effective range ============================================================================== FILE: "holygrove.are" Using the 'QQ' system ============================================================================== #AREA Holy Grove~ #AUTHORS Daith Superdave~ #RANGES 5 20 1 95 #FLAGS AFLAG_NODEBUG #RESETMSG You hear the sound of druids wandering the grove.~ #TEMPERATURE 20 80 15 5 #HELPS 0 HOLYGROVE 'HOLY GROVE'~ {120} Holy Grove {300} The Holy Grove is a place of happiness, a calm peaceful place where the citizens of the realm come to celebrate the spring, where farmers give thanks for bountiful harvests in the fall, and where lovers stroll in the summer. {140} Modified by Daith and Superdave ~ 0 $~ #MOBILES #QQ00 hierophant~ The Hierophant~ The old Hierophant of the holy grove is here, gathering holly.~ He is a very old man, dressed in an old robe; but from the glint in his clear blue eyes you can see that He is aware of the world, and wise to its traps and pitfalls. ~ ACT_SMART|ACT_TRAIN|ACT_BODY|ACT_RACE|ACT_WIMPY AFF_TONGUES|AFF_UNDERSTAND|AFF_SANCTUARY|AFF_DETECT_INVIS 1000 S 20 BODY_HAND_1|BODY_HAND_2 BODY_HAND_1|BODY_HAND_2 20d20+180 1d8+15 5000 RACE_HUMAN POS_STANDING POS_STANDING SEX_MALE >greet_prog 100~ if quest(0,2,$n) == 0 say Greetings stranger, would you care to help me? break endif if actorhasobjnum(QQ23) say I see you have found some holly! say May I have it please? break endif if quest(0,2,$n) == 1 say I'm still waiting for you to bring me some holly. say Perhaps you can find some in the DRAGON's garden. endif ~ >speech_prog dragon~ say The Great Dragon Archibald lives in the home to the south say of the croquet lawn. Perhaps you can find some holly there say in his garden. ~ >speech_prog yes~ if quest(0,2,$n) == 0 say I need some holly leaves for my magic potion. say Gather me some holly and I will reward you. mpmset $n quest 0 2 1 else say Yes what? endif ~ >speech_prog no~ say well thanks anyway. grumble ~ >give_prog iQQ23~ if quest(0,2,$n) == 1 mpmset $n quest 0 2 2 say Thank you for your help. say Please take this as a reward. mpecho $I weaves some of the holly together. mpjunk iQQ23 mpoload QQ24 mpquiet on cast 'giant strength' $n mpquiet off give iQQ24 $n else say Thank you for bringing me more holly! smile $n endif ~ | #QQ01 hierophant~ The Hierophant~ The old Hierophant of the holy grove is here, gathering ivy.~ She is a very old woman, dressed in an old gown; but from the glint in her clear blue eyes you can see that She is aware of the world, and wise to its traps and pitfalls. ~ ACT_WIMPY|ACT_BODY|ACT_SMART|ACT_PRACTICE|ACT_RACE AFF_SANCTUARY|AFF_UNDERSTAND|AFF_TONGUES|AFF_DETECT_INVIS 1000 S 20 BODY_HAND_1|BODY_FOOT_1|BODY_HAND_2 BODY_HAND_1|BODY_FOOT_1|BODY_HAND_2 20d20+180 1d8+15 5000 RACE_HUMAN POS_STANDING POS_STANDING SEX_FEMALE >greet_prog 100~ if quest(2,2,$n) == 0 say Greetings friend, would you care to help me? break endif if actorhasobjnum(QQ22) say I see you found some ivy! say May I have it please? break endif if quest(2,2,$n) == 1 say I'm still waiting for you to bring me some ivy. say Perhaps you can find some in the DRAGON's garden. endif ~ >speech_prog dragon~ say The Great Dragon Archibald lives in the house to the south say of the croquet lawn. Perhaps you can find ivy there in his say wonderful garden. ~ >speech_prog yes~ if quest(2,2,$n) == 0 say I need some ivy to make one of my potions. say Bring me some ivy, and I'll reward you. mpmset $n quest 2 2 1 else say Yes what? endif ~ >speech_prog no~ say well thanks anyway. sigh ~ >give_prog iQQ22~ if quest(2,2,$n) == 1 mpmset $n quest 2 2 2 say Thank you for your help. say Please take this as a reward. mpecho $I ties some of the ivy together. mpjunk iQQ22 mpoload QQ25 mpquiet on cast 'giant strength' $n mpquiet off give iQQ25 $n else say Thanks for more ivy! hug $n endif ~ | #QQ02 elder druid~ an elder druid~ An elder druid stands here, watching the local flora and wildlife.~ He looks ageless, as do all druids. His grey beard contrasts strongly with his lack of wrinkles. ~ ACT_WIMPY AFF_UNDERSTAND|AFF_TONGUES|AFF_TONGUES 1000 S 13 0 0 13d13+130 1d4+10 5000 RACE_HUMAN POS_STANDING POS_STANDING SEX_MALE #QQ03 elder druidess~ an elder druidess~ An elder druidess stands here, watching the local fauna and feeding rabbits.~ She looks ageless, as do all druids. She smiles a beautiful smile at you. ~ ACT_WIMPY|ACT_BODY AFF_TONGUES|AFF_UNDERSTAND 1000 S 13 BODY_HAND_2|BODY_HAND_1|BODY_FOOT_1 BODY_HAND_2|BODY_HAND_1|BODY_FOOT_1 13d13+130 1d4+10 5000 RACE_HUMAN POS_STANDING POS_STANDING SEX_FEMALE >death_prog 100~ if questr (41000,0,4,$n) == 1 if questr (41000,8,8,$n) < 75 if quest (30,1,$n) == 0 mpmset $n quest 30 1 1 mpmadd $n questr 41000 8 8 1 mpoload 30914 mpforce $n HELP GUILDTOKEN mpquiet on give i30914 $n mpquiet off endif endif endif ~ | #QQ04 doe~ a doe~ A doe is here, munching on grass.~ This peaceful creature looks at you with big dark eyes. Her nose twitches as she sniffs at you, but she goes back to chewing some grass. ~ ACT_BODY 0 0 S 6 BODY_HORN BODY_HORN 5d5+35 1d7+2 2 RACE_HUMAN POS_STANDING POS_STANDING SEX_FEMALE #QQ05 deer~ a deer~ A deer is here, staring back at you.~ The deer looks angered at your intrusion. He butts his head against you, albeit ineffectively. ~ ACT_BODY 0 0 S 7 BODY_HORN BODY_HORN 6d6+40 1d4+4 2 RACE_HUMAN POS_STANDING POS_STANDING SEX_MALE #QQ06 stag deer large~ a stag~ A large deer stag is here, protecting his territory.~ He eyes you with contained anger. You'd better leave him alone! ~ ACT_AGGRESSIVE|ACT_BODY 0 0 S 9 BODY_HORN|BODY_FOOT_2 BODY_HORN|BODY_FOOT_2 7d8+40 1d4+6 2 RACE_HUMAN POS_STANDING POS_STANDING SEX_MALE #QQ07 bunny rabbit~ a small bunny~ A small bunny is here, poking from bush to bush.~ This bunny looks so adorable, you wished you had one just like this! ~ ACT_BODY 0 0 S 2 BODY_FOOT_1 BODY_FOOT_1 2d2+10 1d1+5 2 RACE_HUMAN POS_STANDING POS_STANDING SEX_NEUTRAL #QQ08 snake~ a harmless snake~ A small snake slithers between the grass.~ Upon careful inspection, you are sure it is NOT a cobra! ~ ACT_BODY|ACT_AGGRESSIVE AFF_SNEAK 0 S 4 BODY_MOUTH BODY_MOUTH 4d4+10 1d1+6 2 RACE_HUMAN POS_STANDING POS_STANDING SEX_NEUTRAL #QQ09 druid~ a druid~ A druid is here in meditation.~ He doesn't like you bothering him, but is too polite to ask you to leave. ~ ACT_WIMPY AFF_DETECT_INVIS 1000 S 10 0 0 10d10+100 1d4+11 50 RACE_HUMAN POS_STANDING POS_STANDING SEX_MALE #QQ10 druidess~ a druidess~ A druidess is here, peering at you.~ She wonders why you are staring at her, and how you got in here. ~ ACT_WIMPY AFF_DETECT_INVIS 1000 S 10 0 0 10d10+100 1d4+11 50 RACE_HUMAN POS_STANDING POS_STANDING SEX_FEMALE #QQ11 archibald dragon majestic~ Archibald~ The great dragon Archibald is here.~ The dragon before you appears to be three times your size. He is curled up relaxing on floor. His green scales reflect light and blind you for a moment. ~ ACT_SENTINEL|ACT_SMART|ACT_BODY AFF_DETECT_HIDDEN|AFF_SANCTUARY|AFF_UNDERSTAND|AFF_FLYING|AFF_TONGUES|AFF_DETECT_INVIS 1000 S 15 BODY_WING|BODY_TAIL|BODY_CLAW_1 BODY_WING|BODY_TAIL|BODY_CLAW_1 10d10+200 10d2+4 9142 RACE_HUMAN POS_STANDING POS_STANDING SEX_MALE >greet_prog 100~ if quest(12,2,$n) == 0 mpechoat $n $I sniffs sadly. tell $n can you perhaps help me with something? else if quest(8,4,$n) == 15 mpmset $n quest 8 4 0 if quest(12,2,$n) == 1 mpoload QQ26 say Thank you $n! You have helped clean my garden! mpecho $I gets a shining scale from a small box. give iQQ26 $n drop iQQ26 say Take this as a token of my gratitude. mpmset $n quest 12 2 2 else say Thanks again for cleaning out those weeds. say Here, have some money. It's the least I can do. mpoload QQ28 drop iQQ28 endif endif endif ~ >speech_prog yes~ if quest(12,2,$n) == 0 mpmset $n quest 12 2 1 tell $n My lovely garden has been overgrown by weeds lately. tell $n If you could go and destroy some of those weeds for me, tell $n I will reward you handsomely. else say Yes what? endif ~ | #QQ12 ethmobgrove~ ethereal grove mob~ ~ ~ ACT_SENTINEL AFF_ETHEREAL 0 S 1 0 0 1d1+20 1d1+3 0 0 POS_STANDING POS_STANDING SEX_NEUTRAL #QQ13 black bloodroot sapling~ a bloodroot sapling~ A small black sapling grows here.~ This small sapling has been infected by the bloodroot disease. It must be destroyed before it infects any other trees in the grove! ~ ACT_SENTINEL AFF_BLIND|AFF_CURSE 0 S 13 0 0 1d1+75 1d13+1 5000 RACE_HUMAN POS_STANDING POS_STANDING SEX_NEUTRAL #QQ14 bloodroot tree~ a bloodroot tree~ A large bloodroot tree grows here.~ This large tree has been infected by bloodroot disease. You can see drops of red sap along the base of its roots. You had better chop down this tree before it spreads and infects the other trees of the grove. ~ ACT_SENTINEL AFF_CURSE|AFF_BLIND 0 S 19 0 0 1d1+130 1d19+1 5000 RACE_HUMAN POS_STANDING POS_STANDING SEX_NEUTRAL #QQ15 overgrown weed~ an overgrown weed~ A gigantic overgrown weed grows here.~ This giant weed grows in the lovely garden. Archibald doesn't like weeds however, for they rob his flowers of their precious nutrients. The toothed leaves look at little dangerous, but its merely a plant and shouldn't be too much of a problem for you to destroy it. ~ ACT_SENTINEL AFF_BLIND|AFF_CURSE 0 S 9 0 0 1d1+50 4d2+1 500 RACE_HUMAN POS_STANDING POS_STANDING SEX_NEUTRAL >death_prog 100~ if quest (12,2,$n) != 0 if quest (8,4,$n) < 15 mpmadd $n quest 8 4 1 else mpechoat $n {160}You have killed enough weeds for today, go see Archibald for your reward. endif endif ~ | #QQ16 bee~ a honey bee~ A giant honey bee flies around here.~ This giant bee quickly flies from flower to flower, pollenating them as it drinks the nectar from the blooms. ~ ACT_BODY|ACT_SENTINEL AFF_CURSE|AFF_FLYING|AFF_FAERIE_FIRE|AFF_BLIND 0 S 9 BODY_WING BODY_WING|BODY_TAIL 1d1+50 4d2+1 100 RACE_HUMAN POS_STANDING POS_STANDING SEX_NEUTRAL >rand_prog 5~ mpecho Bzzzzzzzzzzzzzzz ~ | #QQ17 ethereal fountain~ ethereal fountain~ The ethereal fountain is standing here~ ~ ACT_SENTINEL|ACT_SMART AFF_UNDERSTAND|AFF_TONGUES|AFF_ETHEREAL 0 S 50 0 0 1d1+2500 1d1+100 0 RACE_HUMAN POS_STANDING POS_STANDING SEX_FEMALE >rand_prog 100~ mpquiet on if isaffected ($r) == spell_sanctuary if isaffected ($r) == spell_enhanced_heal if isaffected ($r) == spell_shield if isaffected ($r) == spell_giant_strength if isaffected ($r) == spell_armor cast feast break endif cast armor $r break endif cast 'giant strength' $r break endif cast shield $r break endif cast 'enhanced heal' $r break endif cast sanctuary $r mpquiet off ~ >act_prog p drinks from a garden fountain~ if isaffected ($n) == spell_bless break endif mpquiet on cast bless $n mpquiet off mpechoat $n {160}A powerful blessing is laid upon you. ~ | #QQ30 etherealobelisk~ The Ethereal Obelisk~ The Ethereal Obelisk stands here.~ ~ ACT_SENTINEL AFF_DETECT_HIDDEN|AFF_ETHEREAL|AFF_DETECT_INVIS 0 S 1 0 0 0d0+10 0d0+3 0 RACE_HUMAN POS_STANDING POS_STANDING SEX_NEUTRAL >speech_prog roterodamum rot~ if hasobjnum (QQ31) if level ($n) > 25 if level ($n) < 99 mpecho {170}Laughter echoes through the grove. break endif endif if quest (0,5,$i) == 0 mpmset self quest 0 5 10 mposet kladblok short $n mpecho {170}White strings of magic start to spin around the obelisk. else mpechoat $n The obelisk seems to be about to transport $C. endif endif ~ >rand_prog 100~ if quest (0,5,$i) > 0 mpmadd self quest 5 5 1 if quest (5,5,$i) > 9 mpmset self quest 0 10 0 mpecho {170}The white strings of magic vanish. break endif if hasobjnum (QQ31) mpmset $C quest 100 1 1 if quest (100,1,$r) == 1 mpmset $r quest 100 1 0 mpechoat $r {160}Arms from white magic pull you through the obelisk to your destination. mpechoaround $r {170}Arms from white magic pull $r into the black obelisk. if quest (0,5,$i) == 10 mptransfer $r 9702 mpat $r mpforce $r look mpmset self quest 0 10 0 break endif endif mpmset $C quest 100 1 0 if rand (50) mpechoaround $C {170}Energy sizzles through the air slowly surrounding $C. else mpechoaround $C {170}Energy sizzles through the air. endif mpechoat $C {160}Energy sizzles through the air slowly surrounding you. endif endif ~ | #0 #OBJECTS #QQ01 closet~ a closet~ There is a wooden closet tucked into a corner.~ It is large, yet gracefully made, obviously of Scandinavian design.~ ITEM_TYPE_CONTAINER FLAG_LEVEL 0 100 1 -1 0 500 0 7 #QQ02 jar~ a spice jar~ A small unlabeled spice jar is standing here.~ ~ ITEM_TYPE_CONTAINER FLAG_LEVEL CAN_WEAR_TAKE 5 5 -1 0 1 10 1 #QQ03 powder black~ some black powder~ Some strong-smelling black powder has been carelessly scattered here.~ * * * * * * **** AAAHHHH-TSHOU! **** * * * * * * ~ ITEM_TYPE_FOOD FLAG_LEVEL CAN_WEAR_TAKE -2 0 0 NOT_POISONED 1 300 1 P 1 TRIG_TICK 5 OPROG_IF OIF_USER_POSITION > POS_SLEEPING 2 0 P 2 TRIG_VOID OPROG_GOD_COMMAND look IQQ03&mpechoaround self $n sneezes loudly. AAAHHHH-TSHOU!~ #QQ04 kernel kernels~ some small yellow kernels~ Some small yellow kernels have been accidentally left here.~ They look fairly dull...~ ITEM_TYPE_FOOD FLAG_LEVEL CAN_WEAR_HOLD|CAN_WEAR_TAKE 1 0 0 NOT_POISONED 1 10 1 #QQ05 paper wad~ a crumpled wad of paper~ There is a crumpled wad of paper here, left behind by some messy bypasser.~ ~ ITEM_TYPE_TRASH FLAG_LEVEL CAN_WEAR_HOLD|CAN_WEAR_TAKE 0 0 0 0 1 0 1 #QQ10 staff wooden~ a wooden staff~ You see a wooden staff on the floor.~ This oaken staff is very hefty but balanced. ~ ITEM_TYPE_WEAPON FLAG_ANTI_EVIL|FLAG_LEVEL CAN_WEAR_WIELD|CAN_WEAR_TAKE 0 3 3 WEAPON_POUND 5 50 6 #QQ11 robe brown cloth~ a brown robe~ Some brown cloth is on the floor.~ This robe is rough, but appears quite durable.~ ITEM_TYPE_ARMOR FLAG_ANTI_EVIL|FLAG_LEVEL|FLAG_MAGIC CAN_WEAR_TAKE|CAN_WEAR_BODY 6 0 0 0 5 60 10 A APPLY_MANA 10 #QQ13 bluish herbs~ some bluish herbs~ Some bluish herbs are scattered here.~ You remember from your nature classes that these herbs provide protection. ~ ITEM_TYPE_PILL FLAG_LEVEL|FLAG_MAGIC CAN_WEAR_TAKE 15 SPELL_SHIELD SPELL_ARMOR SPELL_STONE_SKIN 1 1 15 #QQ14 purplish herbs~ some purplish herbs~ Some purplish herbs are scattered here.~ You remember from your nature classes that these herbs can make you stronger for a bit. ~ ITEM_TYPE_PILL FLAG_LEVEL|FLAG_MAGIC CAN_WEAR_TAKE 15 SPELL_BLESS SPELL_CURE_POISON SPELL_GIANT_STRENGTH 1 1 15 #QQ15 blackish herbs~ some blackish herbs~ Some blackish herbs are scattered here.~ You remember from your nature classes that these herbs can transport you back to your room of recall. ~ ITEM_TYPE_PILL FLAG_LEVEL CAN_WEAR_TAKE 1 SPELL_NONE SPELL_NONE SPELL_WORD_OF_RECALL 0 100 1 #QQ16 grayish herbs~ some grayish herbs~ Some grayish herbs are scattered here.~ You remember from your nature classes that these herbs can help you understand and speak many languages. ~ ITEM_TYPE_PILL FLAG_MAGIC|FLAG_LEVEL CAN_WEAR_TAKE 10 SPELL_COMPREHEND_LANGUAGES SPELL_TONGUES SPELL_NONE 0 100 10 #QQ17 reddish herbs~ some reddish herbs~ Some reddish herbs are scattered here.~ You remember from your nature classes that these herbs will allow you to see things more clearly. ~ ITEM_TYPE_PILL FLAG_MAGIC|FLAG_LEVEL CAN_WEAR_TAKE 15 SPELL_DETECT_INVIS SPELL_DETECT_SECRET SPELL_INFRAVISION 0 100 15 #QQ18 orangish herbs~ some orangish herbs~ Some orangish herbs are scattered here.~ You remember from your nature classes that these herbs can miraculously heal your wounds. ~ ITEM_TYPE_PILL FLAG_LEVEL CAN_WEAR_TAKE 10 SPELL_CURE_CRITICAL SPELL_CURE_CRITICAL SPELL_CURE_CRITICAL 0 100 10 #QQ19 pinkish herbs~ some pinkish herbs~ Some pinkish herbs are scattered here.~ You remember from your nature classes that these herbs can help reduce damage taken in battle. ~ ITEM_TYPE_PILL FLAG_MAGIC|FLAG_LEVEL CAN_WEAR_TAKE 10 SPELL_PROTECTION_EVIL SPELL_SANCTUARY SPELL_PROTECTION_GOOD 0 100 10 #QQ20 holly bush~ a holly bush~ A small bush of holly grows here.~ The bush is quite small and green, and it looks to have some holy inside of it. ~ ITEM_TYPE_CONTAINER FLAG_LEVEL 0 24 0 0 0 0 10 1 #QQ21 patch ivy~ a patch of ivy~ A patch of ivy grows here.~ There is a small patch of ivy here. Glancing inside, you can see some nice fresh ivy just ready to be taken. ~ ITEM_TYPE_CONTAINER FLAG_LEVEL 0 24 0 0 0 0 10 1 #QQ22 ivy~ some ivy~ Some ivy is here.~ ~ ITEM_TYPE_PILL FLAG_LEVEL CAN_WEAR_TAKE 5 SPELL_CURE_LIGHT SPELL_CURE_LIGHT SPELL_CURE_LIGHT 0 10 5 #QQ23 holly~ a small piece of holly~ A small piece of holly is here.~ ~ ITEM_TYPE_PILL FLAG_LEVEL CAN_WEAR_TAKE 5 SPELL_CURE_LIGHT SPELL_CURE_LIGHT SPELL_CURE_LIGHT 1 1 5 #QQ24 holly belt~ a small belt made of holly~ A small ring of holly is laying here.~ ~ ITEM_TYPE_ARMOR FLAG_LEVEL CAN_WEAR_WAIST|CAN_WEAR_TAKE 5 0 0 0 5 60 10 A APPLY_DEX 2 A APPLY_DAMROLL 2 #QQ25 ivy necklace~ a small necklace made of ivy~ A small ring of ivy is here.~ ~ ITEM_TYPE_ARMOR FLAG_LEVEL CAN_WEAR_NECK|CAN_WEAR_TAKE 5 0 0 0 5 60 10 A APPLY_INT 2 A APPLY_CON 2 A APPLY_WIS 2 #QQ26 scale dragon~ a scale of the great dragon archibald~ A small greenish scale is here.~ ~ ITEM_TYPE_ARMOR FLAG_ANTI_EVIL|FLAG_MAGIC|FLAG_LEVEL CAN_WEAR_ARMS|CAN_WEAR_TAKE|CAN_WEAR_SHIELD 5 0 0 0 5 60 10 A APPLY_DAMROLL 2 A APPLY_HITROLL 2 #QQ27 fountain~ a garden fountain~ A beatiful fountain sprays water into the air.~ This fountain is in the shape of a beautiful naked woman carrying a large urn. You stare at it for a while longer, then proceed with your duties. ~ ITEM_TYPE_FOUNTAIN FLAG_GLOW|FLAG_LEVEL 0 0 0 0 0 1000 10 1 #QQ28 pile coins~ a huge pile of coins~ A huge pile of coins has been dropped here!~ ~ ITEM_TYPE_MONEY FLAG_GLOW|FLAG_LEVEL CAN_WEAR_TAKE 200000 0 0 0 10 200000 1 #QQ30 black obelisk~ a black obelisk~ A black obelisk rises from the ground here.~ {070} {070} _____________________________________________________________ {070} / \ {070} | Simply say the name of the location to which you would like | {070} | to travel and the obelisk will magically transport you. | {070} | | {070} | Available locations include: Recommended levels: | {070} | | {070} | Roterodamum Levels 1 - 95 | {070} \______________________________________________________________/ ~ ITEM_TYPE_TREASURE FLAG_LEVEL 0 0 0 0 0 100 100 1 #QQ31 notepad~ notepad~ a notepad with all kind of names written on it lies here.~ You see a storage object for temporary names used by the obelisk ethereal, the messy handwritings on it make you wonder about ethereal education.~ ITEM_TYPE_FURNITURE FLAG_LEVEL CAN_WEAR_TAKE 0 0 0 0 0 0 1 #0 #ROOMS #QQ00 The entrance to a large lovely garden~ You stand upon a well kept path which leads southward into an enormous garden. The smooth ground upon which you stand is free of any dirty or weeds. ~ QQ 0 SECT_INSIDE DDIR_NORTH ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ19 DDIR_SOUTH ~ ~ 0 -1 QQ20 S #QQ01 The holy grove~ You are standing amidst the ancient oaks and poplars in the holy grove. You can feel a strange sensation of contentedness and relief seeping through You, as if great burdens have been lifted from Your shoulders. From here, friendly-looking paths lead east and south. ~ QQ 0 SECT_FOREST DDIR_EAST The path wind its way through the tall trees, disappearing out of sight. ~ ~ 0 -1 QQ02 DDIR_SOUTH The path wind its way through the tall trees, disappearing out of sight. ~ ~ 0 -1 QQ04 S #QQ02 The holy grove~ You are standing amidst the ancient oaks and poplars in the holy grove. You feel unusually happy here, as if great burdens have been lifted from Your shoulders. From here, pleasant-looking paths lead east, west and south. ~ QQ 0 SECT_FOREST DDIR_EAST The path wind its way through the tall trees, towards a clearing faintly seen. ~ ~ 0 -1 QQ03 DDIR_SOUTH The path wind its way through the tall trees, towards an open area barely visible in the distance. ~ ~ 0 -1 QQ05 DDIR_WEST The path wind its way through the tall trees, disappearing out of sight. ~ ~ 0 -1 QQ01 S #QQ03 A clearing in the woods~ You are standing in a clearing in the light woods. Somehow, this place seems powerfully DIFFERENT from the rest of the forest, as if something is severely strained in the fabric of reality here. There is a small tablet on one of the trees. ~ QQ ROOM_NO_MOB SECT_FOREST DDIR_NORTH A small, narrow path winds north, and is quickly lost in the bushes. It looks quite a wilderness there! ~ ~ 0 -1 5378 DDIR_SOUTH There is a path winding its way south through the tall poplars, disappearing out of sight some 100 yds. away. ~ ~ 0 -1 QQ06 DDIR_WEST There is a friendly-looking path leading west through the tall trees. ~ ~ 0 -1 QQ02 E tablet~ This zone has been populated by Merc. 1993 ~ S #QQ04 The holy grove~ You are standing amidst the ancient oaks and poplars in the holy grove. You feel calm and relaxed here, as if great burdens have been lifted from Your shoulders. From here, pleasant-looking paths lead east, north and south. To the west, through the trees, you can see the gate of Midgaard. ~ QQ ROOM_NO_MOB SECT_FOREST DDIR_NORTH The path wind its way through the tall trees, disappearing out of sight. ~ ~ 0 -1 QQ01 DDIR_EAST The path wind its way through the tall trees, towards a clearing faintly seen. ~ ~ 0 -1 QQ05 DDIR_SOUTH The path wind its way through the tall trees, into the grove. ~ ~ 0 -1 QQ07 DDIR_WEST ~ ~ 0 -1 3053 S #QQ05 The sacred glade~ You are standing in the middle of the sacred glades, where the citizens of Chakkor come to celebrate the spring, where farmers give thanks for bountiful harvest in the fall, and where lovers stroll in summer. You feel seasons of remembered happiness and joy taking Your sorrows and worries away from You, leaving You calm and invigorated, ready for the world. Paths lead into the holy grove to the east, north and west, while to the south a wide, sunny field slopes down to a sparkling lake. ~ QQ 0 SECT_FOREST DDIR_NORTH The path wind its way north, disappearing through the tall trees. ~ ~ 0 -1 QQ02 DDIR_EAST The path wind its way through the tall trees, disappearing out of sight. ~ ~ 0 -1 QQ06 DDIR_SOUTH To the south, a wide, sunny field stretch out, sloping down towards a brightly glittering lake. ~ ~ 0 -1 QQ08 DDIR_WEST The path wind its way west between stately poplars and oaks. ~ ~ 0 -1 QQ04 S #QQ06 The holy grove~ You are standing amidst the ancient oaks and poplars in the holy grove. You can feel a strange sensation of joy and calm seeping through You, as if great burdens have been lifted from Your shoulders. To the south, You glimpse an open area through the trees, while paths lead away north and west. ~ QQ 0 SECT_FOREST DDIR_NORTH The path wind its way through the tall trees, disappearing out of sight. ~ ~ 0 -1 QQ03 DDIR_EAST ~ ~ 0 -1 17498 DDIR_SOUTH To the south, just beyond the trees, you can see a wide green lawn, and past the lawn, a softly shimmering, rainbow-colored mansion. ~ ~ 0 -1 QQ09 DDIR_WEST The path wind its way through the tall trees, disappearing out of sight. ~ ~ 0 -1 QQ05 E mansion~ The mansion is a sprawling, two-story affair with three wings, where the top of one wing serves as balcony. The walls look as marble would do, if marble changed color slowly, continuously, through the entire spectrum. There are large windows all over the house. ~ S #QQ07 The holy grove~ You are standing amidst the tall, majestic trees in the southern end of the holy grove. Paths lead north and east. To the east, You can see a wide, open field, sloping gently down towards a bright, glittering lake. Somehow, here you feel an inexplicable happiness, as if the world's troubles no longer really matter to you. ~ QQ 0 SECT_FOREST DDIR_NORTH The path leading north is soon lost out of sight amongst the ancient oaks and poplars. ~ ~ 0 -1 QQ04 DDIR_EAST To the east, the path leads out into a wide, sunny summer's field, sloping south towards a beautiful lake. Past the field You can see a stately mansion, shimmering gently in all the rainbow's colours. ~ ~ 0 -1 QQ08 E mansion~ The mansion is a sprawling, two-story affair with three wings, where the top of one wing serves as balcony. The walls look as marble would do, if marble changed color slowly, continuously, through the entire spectrum. There are large windows all over the house. ~ S #QQ08 The sunny field~ You are standing in the middle of a wide, summery, sunlit field. There is a fragrance of spring in the air, a sound of summer and a feeling of eternal Saturday afternoon. To the south is a clear, sparkling lake, and to the north and west is the holy grove. In the wood's edge, to the east, is a stately mansion, shimmering softly through the colors of the rainbow. You feel as if You could spend the rest of your life here, lying on your back and looking at the patterns of the clouds as they gently drift across the sky. ~ QQ ROOM_INDOORS SECT_FIELD DDIR_NORTH There is a path leading north towards the sacred glade. ~ ~ 0 -1 QQ05 DDIR_EAST To the east, You can see the rainbow-colored mansion, shimmering like some- thing out of this world. ~ ~ 0 -1 QQ19 DDIR_WEST There is a small path leading into the woods to the west. ~ ~ 0 -1 QQ07 E mansion~ The mansion is a sprawling, two-story affair with three wings, where the top of one wing serves as balcony. The walls look as marble would do, if marble changed color slowly, continuously, through the entire spectrum. There are large windows all over the house. There is a terrace in front of the house, next to the low wing, which is almost completely windows. ~ S #QQ09 The croquet lawn~ You are standing on a immaculately manicured green lawn, the kind you only get after 200 years of meticulous work. There is a winding stone path leading from the wood's edge to the north, to the softly shimmering, rainbow-colored mansion to the south. This place enjoys a perpetual cool, sunny summers afternoon. ~ QQ ROOM_NO_MOB SECT_FIELD DDIR_NORTH To the north, the winding stone path leads into the holy grove. ~ ~ 0 -1 QQ06 DDIR_SOUTH To the south, the path leads straight up to the front door of the mansion. ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ10 E mansion~ The mansion is a sprawling, two-story affair with three wings, where the top of one wing serves as balcony. The walls look as marble would do, if marble changed color slowly, continuously, through the entire spectrum. There are large windows all over the house. ~ S #QQ10 The foyer~ You are standing in the foyer of Archibald's mansion. The wide double doors to the croquet lawn is to the north, flanked by large windows. The walls are panelled in oak and hung with strange paintings. There is door in the south wall. ~ QQ ROOM_NO_MOB|ROOM_INDOORS SECT_INSIDE DDIR_NORTH Through the windows next to the door you can see the croquet lawn, bathed in afternoon sunlight. ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ09 DDIR_SOUTH ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ11 E painting paintings~ They are strange indeed, works of breathtaking precision depicting obviously impossible motifs, like a sky filled with headless men, all dressed in some black costume (including hats), or a lady standing, blue from the waist up, or some pieces of plankwood that seems to be melting away like snow, or a night sky with a dove-shaped hole of bright day sky in the middle. ~ S #QQ11 The hallway~ You are in the north end of a connecting hallway, tastefully decorated with oak paneling and the coat-of-arms of various famous nobles hung on the walls. The hallway leads south, and there is a door in the eastern wall. ~ QQ ROOM_INDOORS SECT_INSIDE DDIR_NORTH ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ10 DDIR_EAST ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ12 DDIR_SOUTH ~ ~ 0 -1 QQ13 S #QQ12 The blue room~ You are in the blue room, one of the guest rooms in Archibald's mansion. The walls are (surprise!) blue, and the rest of the room is decorated in similar shades, producing a very nice, cool effect. There is a large bed and a matching set of sofas, easy-chairs and a coffee table. Through the venetian blinds in front of the large east window you can see the edge of the grove. ~ QQ ROOM_PRIVATE|ROOM_INDOORS SECT_INSIDE DDIR_WEST ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ11 S #QQ13 The hallway~ You are standing in the south end of the hallway. There are doors in the elegant oak-panelled walls to the south, east and west. Many different coat-of-arms adorn the walls here. ~ QQ ROOM_INDOORS SECT_INSIDE DDIR_NORTH ~ ~ 0 -1 QQ11 DDIR_EAST ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ14 DDIR_SOUTH ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ15 DDIR_WEST ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ16 S #QQ14 The red room~ You are in the red room, one of the guest rooms in Archibald's mansion. The walls are wallpapered a deep warm red, and dark mahogany panelling nicely complements them. There is a large, warm waterbed and a sofa group in dark wood with leather upholstery, including a coffee table. Heavy brown curtains are pulled away from the wide windows, to reveal a nice view towards the grove. ~ QQ ROOM_PRIVATE|ROOM_INDOORS SECT_INSIDE DDIR_WEST ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ13 S #QQ15 The kitchen~ You are standing in the middle of Archibald's kitchen. Contrary to popular belief, He *doesn't* eat virgins, which is amply demonstrated by the large variety of foodstuffs found here on the shelves. There are numerous cans of tomatoes, peas, corn etc., vines of garlic, a *Huge* array of small spice jars along several shelves and a large combo refrigerator/freezer. A big oven and stove is lurking in a corner. There is some proof here that Archibald is a less than meticulous housekeeper... There are doors to the north and west. ~ QQ ROOM_INDOORS SECT_INSIDE DDIR_NORTH ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ13 DDIR_WEST ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ18 S #QQ16 The ballroom~ You are standing in the middle of a vast palisander floor. This is where Archibald entertains large number of guests, but the cloth-covered chairs standing forlornly in a corner suggests that this does not happen often. There are doors in the south and west walls, while to the east there is a short corridor to the greenhouse. ~ QQ ROOM_INDOORS SECT_INSIDE DDIR_EAST ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ13 DDIR_SOUTH ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ18 DDIR_WEST ~ ~ 0 -1 QQ17 S #QQ17 The greenhouse~ This is Archibalds' greenhouse. Green light filters in slantwise through the plants, giving the room a subtropical ambience. It is not really hot in here, though, rather a pleasantly warm temperature. The walls are all windows, except the eastern one joining the greenhouse to the main building, but it is hard to see out for all the greenery here. There is a set of easy-chairs and a glass coffee table. To the south, there is a wide double door out to a sunlit terrace. ~ QQ ROOM_PRIVATE|ROOM_INDOORS SECT_INSIDE DDIR_EAST ~ ~ 0 -1 QQ16 DDIR_SOUTH ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ19 S #QQ18 The dining hall~ This is Archibalds' dining hall. There is a large long solid oak table, seating at least 24, with heavy, wooden chairs to match. The oak panel walls are filled with paintings. There are doors to the north and east, and to the west there is a wide double door opening out onto the sunlit terrace. ~ QQ ROOM_INDOORS SECT_INSIDE DDIR_NORTH ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ16 DDIR_EAST ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ15 DDIR_WEST ~ wide door~ EX_ISDOOR|EX_CLOSED -1 QQ19 E painting paintings~ There are many, many beautiful paintings of famous dragons of history and literature. There is a big one of Smaug, a group picture of Cuspidorian Toxic Dragons, a rather fearsome picture of Norse Chaos incarnate, a grainy black- and-white photograph of Vorgulremik the Steel Dragon, a romantic picture of Dalvenjah the Mindijaran and Allan the man become dragon. There are three empty frames labeled 'The Chimerical', 'The Mythical' and 'The Hypothetical', A panoramic picture of Strabo flying between the worlds dominate one wall, while a dragons-eye view of Pern (with dragons in the foreground, of course) fills another. There even are a few rare medieval renditions of the great beast of the Revelation. Over the head of the table hangs a rather modest portrait of a silver Dragon, sparkling with blue lightening, looking amused. ~ S #QQ19 The terrace~ You are standing on a sunlit terrace in front of Archibald's mansion. To the west, there is a splendid view over the field down over the lake. To the north is the greenhouse, its large windowpanes shimmering with weird and wonderful colors, while a double door leads into the house proper to the east. It is warm and calm here. There is a white-painted table with a parasol here, together with a matched set of chairs. You can see a lovely garden to the south ~ QQ ROOM_NO_MOB|ROOM_INDOORS SECT_INSIDE DDIR_NORTH ~ door~ EX_ISDOOR|EX_CLOSED -1 QQ17 DDIR_EAST ~ double door~ EX_ISDOOR|EX_CLOSED -1 QQ18 DDIR_SOUTH Garden door ~ garden door~ EX_ISDOOR|EX_CLOSED -1 QQ00 DDIR_WEST ~ ~ 0 -1 QQ08 S #QQ20 A smoothly paved pathway~ You stand long a well kept pathway. You can see many strange plants and flowers to your east and west. Archibalds house is back to the north, while the garden path continues southward. ~ QQ 0 SECT_CITY DDIR_NORTH ~ ~ 0 -1 QQ00 DDIR_EAST ~ ~ 0 -1 QQ22 DDIR_SOUTH ~ ~ 0 -1 QQ23 DDIR_WEST ~ ~ 0 -1 QQ21 S #QQ21 A dark grove of trees~ Many small saplings grow in this portion of the garden. They seem quite sickly however, as if infected by some arboric disease. You notice some larger trees nearby, which seem to be suffering as well. ~ QQ 0 SECT_FOREST DDIR_EAST ~ ~ 0 -1 QQ20 DDIR_SOUTH ~ ~ 0 -1 QQ24 DDIR_WEST ~ ~ 0 -1 QQ29 S #QQ22 A room in the garden~ Many small saplings grow in this portion of the garden. They seem quite sickly however, as if infected by some arboric disease. You notice some larger trees nearby, which seem to be suffering as well. ~ QQ 0 SECT_FOREST DDIR_EAST ~ ~ 0 -1 QQ39 DDIR_SOUTH ~ ~ 0 -1 QQ25 DDIR_WEST ~ ~ 0 -1 QQ20 S #QQ23 North of the center of the garden~ You stand just north of a large fountain. Even from here you can feel the refreshing spray of misty water as it gently touches your face. It is nice and quiet and relaxing in this quiet garden. ~ QQ 0 SECT_CITY DDIR_NORTH ~ ~ 0 -1 QQ20 DDIR_EAST ~ ~ 0 -1 QQ25 DDIR_SOUTH ~ ~ 0 -1 QQ27 DDIR_WEST ~ ~ 0 -1 QQ24 S #QQ24 Inside the garden~ This part of the garden is filled with many fragrant flowers of all types, sizes, and colors. You can hear the buzzing of bees as they fly and pollenate the blooms. The birds chirp and all is happy in this quiet garden. ~ QQ 0 SECT_FIELD DDIR_NORTH ~ ~ 0 -1 QQ21 DDIR_EAST ~ ~ 0 -1 QQ23 DDIR_SOUTH ~ ~ 0 -1 QQ26 DDIR_WEST ~ ~ 0 -1 QQ30 S #QQ25 Inside the garden~ Many fresh and fragrant flowers grow in this section of the garden. A wide variety of colors fill the entire area, as do a swarm of pollenating bees. You hope you do not aggravate them enough that they attack. ~ QQ 0 SECT_FIELD DDIR_NORTH ~ ~ 0 -1 QQ22 DDIR_EAST ~ ~ 0 -1 QQ38 DDIR_SOUTH ~ ~ 0 -1 QQ28 DDIR_WEST ~ ~ 0 -1 QQ23 S #QQ26 West of the garden center~ You stand west of the garden fountain. Many weeds cover the floor here, as if no one tends this section of the garden. You really feel like pulling them out, as they are quite unsightly. ~ QQ 0 SECT_CITY DDIR_NORTH ~ ~ 0 -1 QQ24 DDIR_EAST ~ ~ 0 -1 QQ27 DDIR_SOUTH ~ ~ 0 -1 QQ33 DDIR_WEST ~ ~ 0 -1 QQ31 S #QQ27 At the Center of the garden~ You stand within the center of this big garden. There is a lovely fountain here which spews out crystal clear water. ~ QQ ROOM_SAFE|ROOM_NO_MOB SECT_INN DDIR_NORTH ~ ~ 0 -1 QQ23 DDIR_EAST ~ ~ 0 -1 QQ28 DDIR_SOUTH ~ ~ 0 -1 QQ34 DDIR_WEST ~ ~ 0 -1 QQ26 S #QQ28 One room east of the center of the garden~ You are now east of the center of this colorful garden. Unfortunately, many weeds have sprouted up and ruin the beauty of this path. Perhaps you could kill some. ~ QQ 0 SECT_CITY DDIR_NORTH ~ ~ 0 -1 QQ25 DDIR_EAST ~ ~ 0 -1 QQ37 DDIR_SOUTH ~ ~ 0 -1 QQ35 DDIR_WEST ~ ~ 0 -1 QQ27 S #QQ29 A corner of the garden~ In this dark area of the garden, a few dark evil looking trees grow. They seem to shake and move, as if they are trying to get you. Perhaps it is just your imagination, or perhaps the trees really are alive. ~ QQ 0 SECT_FOREST DDIR_EAST ~ ~ 0 -1 QQ21 DDIR_SOUTH ~ ~ 0 -1 QQ30 S #QQ30 A dark grove of trees~ The trees here look very strange compared to other normal trees. These look dark and evil, unlike the normal trees of the holy grove. They aren't fully grown however, merely saplings. ~ QQ 0 SECT_FOREST DDIR_NORTH ~ ~ 0 -1 QQ29 DDIR_EAST ~ ~ 0 -1 QQ24 DDIR_SOUTH ~ ~ 0 -1 QQ31 S #QQ31 West end of the garden~ You come to the end of the garden. Many tall trees block any further passage to the west. Looking around, all you see are weeds growing everywhere. ~ QQ 0 SECT_CITY DDIR_NORTH ~ ~ 0 -1 QQ30 DDIR_EAST ~ ~ 0 -1 QQ26 DDIR_SOUTH ~ ~ 0 -1 QQ32 S #QQ32 A dark grove of tress~ Many sickly baby trees grow here. They are void of leaves, which have long since dropped off of them and onto the ground. The leafless branches look quite eerie, and you can imagine them moving as they sway in the wind. ~ QQ 0 SECT_FOREST DDIR_NORTH ~ ~ 0 -1 QQ31 DDIR_EAST ~ ~ 0 -1 QQ33 DDIR_SOUTH ~ ~ 0 -1 QQ40 S #QQ33 Inside the garden~ Many flowers bloom here, but the weeds which grow here as well ruin the natural beauty of the flower garden. You do notice a few bees flying around drinking nectar from the blossoms. ~ QQ 0 SECT_FIELD DDIR_NORTH ~ ~ 0 -1 QQ26 DDIR_EAST ~ ~ 0 -1 QQ34 DDIR_SOUTH ~ ~ 0 -1 QQ41 DDIR_WEST ~ ~ 0 -1 QQ32 S #QQ34 Just south of the garden center~ You are now wandering south of the center of the garden. Many giant weeds grow along the sides of the smooth walkway. You wonder if anyone even tends this garden at all. ~ QQ 0 SECT_CITY DDIR_NORTH ~ ~ 0 -1 QQ27 DDIR_EAST ~ ~ 0 -1 QQ35 DDIR_SOUTH ~ ~ 0 -1 QQ42 DDIR_WEST ~ ~ 0 -1 QQ33 S #QQ35 Inside the garden~ Many bright and colorful, as well as fragrant flowers grow in this spot of the garden. However, many wild weeds grow here as well, ruining the other- wise beatiful landscape. ~ QQ 0 SECT_FIELD DDIR_NORTH ~ ~ 0 -1 QQ28 DDIR_EAST ~ ~ 0 -1 QQ36 DDIR_SOUTH ~ ~ 0 -1 QQ43 DDIR_WEST ~ ~ 0 -1 QQ34 S #QQ36 A dark grove of trees~ The trees here look very strange compared to other normal trees. These look dark and evil, unlike the normal trees of the holy grove. They aren't fully grown however, merely saplings. ~ QQ 0 SECT_FOREST DDIR_NORTH ~ ~ 0 -1 QQ37 DDIR_SOUTH ~ ~ 0 -1 QQ44 DDIR_WEST ~ ~ 0 -1 QQ35 S #QQ37 Eastern end of the garden~ You have come to the eastern end of the garden. Many tall trees block any further passage east. Many prickly weeds seem to have over grown this area, as you doubt there is any gardener employed here. ~ QQ 0 SECT_CITY DDIR_NORTH ~ ~ 0 -1 QQ38 DDIR_SOUTH ~ ~ 0 -1 QQ36 DDIR_WEST ~ ~ 0 -1 QQ28 S #QQ38 A dark grove of trees~ Many sickly baby trees grow here. They are void of leaves, which have long since dropped off of them and onto the ground. The leafless branches look quite eerie, and you can imagine them moving as they sway in the wind. ~ QQ 0 SECT_FOREST DDIR_NORTH ~ ~ 0 -1 QQ39 DDIR_SOUTH ~ ~ 0 -1 QQ37 DDIR_WEST ~ ~ 0 -1 QQ25 S #QQ39 A corner of the garden~ In this dark area of the garden, a few dark evil looking trees grow. They seem to shake and move, as if they are trying to get you. Perhaps it is just your imagination, or perhaps the trees really are alive. ~ QQ 0 SECT_FOREST DDIR_SOUTH ~ ~ 0 -1 QQ38 DDIR_WEST ~ ~ 0 -1 QQ22 S #QQ40 A corner of the garden~ In this dark area of the garden, a few dark evil looking trees grow. They seem to shake and move, as if they are trying to get you. Perhaps it is just your imagination, or perhaps the trees really are alive. ~ QQ 0 SECT_FOREST DDIR_NORTH ~ ~ 0 -1 QQ32 DDIR_EAST ~ ~ 0 -1 QQ41 S #QQ41 A dark grove of trees~ The trees here look very strange compared to other normal trees. These look dark and evil, unlike the normal trees of the holy grove. They aren't fully grown however, merely saplings. ~ QQ 0 SECT_FOREST DDIR_NORTH ~ ~ 0 -1 QQ33 DDIR_EAST ~ ~ 0 -1 QQ42 DDIR_WEST ~ ~ 0 -1 QQ40 S #QQ42 Southern end of the Garden~ You stand at the southern most room of the garden. Here many weeds have overgrown the walkwalk. You wonder where the gardener is, for who could have grown such beatiful garden yet let weeds grow rampant like this? ~ QQ 0 SECT_CITY DDIR_NORTH ~ ~ 0 -1 QQ34 DDIR_EAST ~ ~ 0 -1 QQ43 DDIR_WEST ~ ~ 0 -1 QQ41 S #QQ43 A dark grove of trees~ The trees here look very strange compared to other normal trees. These look dark and evil, unlike the normal trees of the holy grove. They aren't fully grown however, merely saplings. ~ QQ 0 SECT_FOREST DDIR_NORTH ~ ~ 0 -1 QQ35 DDIR_EAST ~ ~ 0 -1 QQ44 DDIR_WEST ~ ~ 0 -1 QQ42 S #QQ44 A corner of the garden~ In this dark area of the garden, a few dark evil looking trees grow. They seem to shake and move, as if they are trying to get you. Perhaps it is just your imagination, or perhaps the trees really are alive. ~ QQ 0 SECT_FOREST DDIR_NORTH ~ ~ 0 -1 QQ36 DDIR_WEST ~ ~ 0 -1 QQ43 S #0 #SHOPS 0 #RESETS O 0 QQ30 1 QQ00 ; Obelisk M 0 QQ30 1 QQ00 ; Obelisk ethereal G 1 QQ31 1 ; Kladblok M 0 QQ00 1 QQ05 ; The Hierophant in The sacred glade E 1 QQ10 99 WEAR_WIELD ; wooden staff E 1 QQ11 99 WEAR_ABOUT ; brown robe G 1 QQ19 99 ; pinkish herbs G 1 QQ18 99 ; orangish herbs M 0 QQ01 1 QQ01 ; The Hierophant in The holy grove E 1 QQ10 99 WEAR_WIELD ; wooden staff E 1 QQ11 99 WEAR_ABOUT ; brown robe G 1 QQ13 99 ; bluish herbs G 1 QQ15 99 ; blackish herbs M 0 QQ02 1 QQ02 ; an elder druid in The holy grove E 1 QQ10 99 WEAR_WIELD ; wooden staff G 1 QQ14 99 ; purplish herbs G 1 QQ16 99 ; grayish herbs M 0 QQ03 1 QQ04 ; an elder druidess in The holy grove E 1 QQ10 99 WEAR_WIELD ; wooden staff G 1 QQ19 99 ; pinkish herbs G 1 QQ17 99 ; reddish herbs M 0 QQ04 2 QQ05 ; a doe in The sacred glade M 0 QQ05 2 QQ06 ; a deer in The holy grove M 0 QQ07 4 QQ03 ; a small bunny in A clearing in the woods M 0 QQ09 1 QQ11 ; a druid in The hallway G 1 QQ13 99 ; bluish herbs M 0 QQ09 2 QQ18 ; a druid in The dining hall M 0 QQ11 1 QQ16 ; Archibald in The ballroom G 1 QQ16 99 ; grayish herbs M 0 QQ10 1 QQ14 ; a druidess in The red room G 1 QQ14 99 ; purplish herbs M 0 QQ10 2 QQ17 ; a druidess in The greenhouse M 0 QQ14 1 QQ44 ; a bloodroot tree in A corner of the garden G 1 QQ19 100 ; pinkish herbs M 0 QQ14 1 QQ44 ; a bloodroot tree in A corner of the garden G 1 QQ18 100 ; orangish herbs M 0 QQ14 1 QQ44 ; a bloodroot tree in A corner of the garden G 1 QQ16 100 ; grayish herbs M 0 QQ14 1 QQ44 ; a bloodroot tree in A corner of the garden G 1 QQ17 100 ; reddish herbs M 0 QQ13 1 QQ43 ; a bloodroot sapling in A dark grove of trees G 1 QQ14 100 ; purplish herbs M 0 QQ13 1 QQ43 ; a bloodroot sapling in A dark grove of trees G 1 QQ18 100 ; orangish herbs M 0 QQ13 1 QQ43 ; a bloodroot sapling in A dark grove of trees G 1 QQ16 100 ; grayish herbs M 0 QQ15 1 QQ42 ; an overgrown weed in Southern end of the Garde M 0 QQ15 1 QQ42 ; an overgrown weed in Southern end of the Garde M 0 QQ15 1 QQ42 ; an overgrown weed in Southern end of the Garde M 0 QQ13 1 QQ41 ; a bloodroot sapling in A dark grove of trees G 1 QQ17 100 ; reddish herbs M 0 QQ13 1 QQ41 ; a bloodroot sapling in A dark grove of trees G 1 QQ14 100 ; purplish herbs M 0 QQ13 1 QQ41 ; a bloodroot sapling in A dark grove of trees G 1 QQ13 100 ; bluish herbs M 0 QQ14 1 QQ40 ; a bloodroot tree in A corner of the garden G 1 QQ13 100 ; bluish herbs M 0 QQ14 1 QQ40 ; a bloodroot tree in A corner of the garden G 1 QQ14 100 ; purplish herbs M 0 QQ14 1 QQ40 ; a bloodroot tree in A corner of the garden G 1 QQ18 100 ; orangish herbs M 0 QQ14 1 QQ40 ; a bloodroot tree in A corner of the garden G 1 QQ18 100 ; orangish herbs M 0 QQ14 1 QQ39 ; a bloodroot tree in A corner of the garden G 1 QQ19 100 ; pinkish herbs M 0 QQ14 1 QQ39 ; a bloodroot tree in A corner of the garden G 1 QQ17 100 ; reddish herbs M 0 QQ14 1 QQ39 ; a bloodroot tree in A corner of the garden G 1 QQ18 100 ; orangish herbs M 0 QQ14 1 QQ39 ; a bloodroot tree in A corner of the garden G 1 QQ13 100 ; bluish herbs M 0 QQ13 1 QQ38 ; a bloodroot sapling in A dark grove of trees G 1 QQ15 100 ; blackish herbs M 0 QQ13 1 QQ38 ; a bloodroot sapling in A dark grove of trees G 1 QQ18 100 ; orangish herbs M 0 QQ13 1 QQ38 ; a bloodroot sapling in A dark grove of trees G 1 QQ17 100 ; reddish herbs M 0 QQ15 1 QQ37 ; an overgrown weed in Eastern end of the garden M 0 QQ15 1 QQ37 ; an overgrown weed in Eastern end of the garden M 0 QQ15 1 QQ37 ; an overgrown weed in Eastern end of the garden M 0 QQ13 1 QQ36 ; a bloodroot sapling in A dark grove of trees G 1 QQ18 100 ; orangish herbs M 0 QQ13 1 QQ36 ; a bloodroot sapling in A dark grove of trees G 1 QQ16 100 ; grayish herbs M 0 QQ13 1 QQ36 ; a bloodroot sapling in A dark grove of trees G 1 QQ13 100 ; bluish herbs M 0 QQ15 1 QQ35 ; an overgrown weed in Inside the garden M 0 QQ15 1 QQ35 ; an overgrown weed in Inside the garden M 0 QQ16 1 QQ35 ; a honey bee in Inside the garden M 0 QQ15 1 QQ34 ; an overgrown weed in Just south of the garden M 0 QQ15 1 QQ34 ; an overgrown weed in Just south of the garden M 0 QQ15 1 QQ34 ; an overgrown weed in Just south of the garden M 0 QQ15 1 QQ33 ; an overgrown weed in Inside the garden M 0 QQ15 1 QQ33 ; an overgrown weed in Inside the garden M 0 QQ16 1 QQ33 ; a honey bee in Inside the garden M 0 QQ13 1 QQ32 ; a bloodroot sapling in A dark grove of tress G 1 QQ13 100 ; bluish herbs M 0 QQ13 1 QQ32 ; a bloodroot sapling in A dark grove of tress G 1 QQ18 100 ; orangish herbs M 0 QQ13 1 QQ32 ; a bloodroot sapling in A dark grove of tress G 1 QQ14 100 ; purplish herbs M 0 QQ15 1 QQ31 ; an overgrown weed in West end of the garden M 0 QQ15 1 QQ31 ; an overgrown weed in West end of the garden M 0 QQ15 1 QQ31 ; an overgrown weed in West end of the garden M 0 QQ13 1 QQ30 ; a bloodroot sapling in A dark grove of trees G 1 QQ14 100 ; purplish herbs M 0 QQ13 1 QQ30 ; a bloodroot sapling in A dark grove of trees G 1 QQ19 100 ; pinkish herbs M 0 QQ13 1 QQ30 ; a bloodroot sapling in A dark grove of trees G 1 QQ15 100 ; blackish herbs M 0 QQ14 1 QQ29 ; a bloodroot tree in A corner of the garden G 1 QQ19 100 ; pinkish herbs M 0 QQ14 1 QQ29 ; a bloodroot tree in A corner of the garden G 1 QQ18 100 ; orangish herbs M 0 QQ14 1 QQ29 ; a bloodroot tree in A corner of the garden G 1 QQ14 100 ; purplish herbs M 0 QQ14 1 QQ29 ; a bloodroot tree in A corner of the garden G 1 QQ13 100 ; bluish herbs M 0 QQ15 1 QQ28 ; an overgrown weed in One room east of the cent M 0 QQ15 1 QQ28 ; an overgrown weed in One room east of the cent M 0 QQ15 1 QQ28 ; an overgrown weed in One room east of the cent M 0 QQ17 1 QQ27 ; fountain in At the Center of the gard M 0 QQ15 1 QQ26 ; an overgrown weed in West of the garden center M 0 QQ15 1 QQ26 ; an overgrown weed in West of the garden center M 0 QQ15 1 QQ26 ; an overgrown weed in West of the garden center M 0 QQ16 1 QQ25 ; a honey bee in Inside the garden M 0 QQ15 1 QQ25 ; an overgrown weed in Inside the garden M 0 QQ15 1 QQ25 ; an overgrown weed in Inside the garden M 0 QQ15 1 QQ24 ; an overgrown weed in Inside the garden M 0 QQ15 1 QQ24 ; an overgrown weed in Inside the garden M 0 QQ16 1 QQ24 ; a honey bee in Inside the garden M 0 QQ13 1 QQ22 ; a bloodroot sapling in A room in the garden G 1 QQ18 100 ; orangish herbs M 0 QQ13 1 QQ22 ; a bloodroot sapling in A room in the garden G 1 QQ16 100 ; grayish herbs M 0 QQ13 1 QQ22 ; a bloodroot sapling in A room in the garden G 1 QQ14 100 ; purplish herbs M 0 QQ13 1 QQ21 ; a bloodroot sapling in A dark grove of trees G 1 QQ18 100 ; orangish herbs M 0 QQ13 1 QQ21 ; a bloodroot sapling in A dark grove of trees G 1 QQ15 100 ; blackish herbs M 0 QQ13 1 QQ21 ; a bloodroot sapling in A dark grove of trees G 1 QQ19 100 ; pinkish herbs O 0 QQ01 2 QQ12 ; a closet in The blue room O 0 QQ01 2 QQ14 ; a closet in The red room O 0 QQ02 2 QQ15 ; a spice jar in The kitchen P 1 QQ03 1 QQ02 ; black powder in a spice jar P 1 QQ04 1 QQ02 ; small yellow kernels in a spice jar O 0 QQ02 2 QQ15 ; a spice jar in The kitchen O 0 QQ05 1 QQ15 ; a crumpled wad of paper in The kitchen O 0 QQ27 1 QQ27 ; a garden fountain in At the Center of the gard O 0 QQ20 1 QQ42 ; a holly bush in Southern end of the Garde P 1 QQ23 5 QQ20 ; a small piece of holly in a holly bush O 0 QQ21 1 QQ37 ; a patch of ivy in Eastern end of the garden P 1 QQ22 5 QQ21 ; some ivy in a patch of ivy D 0 QQ14 DIR_WEST DOOR_CLOSED ; door in The red room D 0 QQ13 DIR_EAST DOOR_CLOSED ; door in The hallway D 0 QQ12 DIR_WEST DOOR_CLOSED ; door in The blue room D 0 QQ11 DIR_EAST DOOR_CLOSED ; door in The hallway D 0 QQ11 DIR_NORTH DOOR_CLOSED ; door in The hallway D 0 QQ10 DIR_SOUTH DOOR_CLOSED ; door in The foyer D 0 QQ10 DIR_NORTH DOOR_CLOSED ; door in The foyer D 0 QQ09 DIR_SOUTH DOOR_CLOSED ; door in The croquet lawn D 0 QQ13 DIR_SOUTH DOOR_CLOSED ; door in The hallway D 0 QQ15 DIR_NORTH DOOR_CLOSED ; door in The kitchen D 0 QQ13 DIR_WEST DOOR_CLOSED ; door in The hallway D 0 QQ16 DIR_EAST DOOR_CLOSED ; door in The ballroom D 0 QQ18 DIR_NORTH DOOR_CLOSED ; door in The dining hall D 0 QQ16 DIR_SOUTH DOOR_CLOSED ; door in The ballroom D 0 QQ18 DIR_EAST DOOR_CLOSED ; door in The dining hall D 0 QQ15 DIR_WEST DOOR_CLOSED ; door in The kitchen D 0 QQ18 DIR_WEST DOOR_CLOSED ; door in The dining hall D 0 QQ19 DIR_EAST DOOR_CLOSED ; door in The terrace D 0 QQ17 DIR_SOUTH DOOR_CLOSED ; door in The greenhouse D 0 QQ19 DIR_NORTH DOOR_CLOSED ; door in The terrace D 0 QQ19 DIR_SOUTH DOOR_CLOSED ; door in The terrace D 0 QQ00 DIR_NORTH DOOR_CLOSED ; door in The entrance to a large l S #$