INTRODUCTION ============ So you want to be a builder. That is excellent. NostalgiaMUD is always looking out for new areas or zones. Before you dive in and start building, however, there are a few general things to consider. First, your area has to be internally geographically consistent. In general, that means no room sets that link with each other in random asymmetric ways (like, for instance, the original Great Eastern Desert area which is impossible to navigate.) That is not to say you cannot have a "lost in the wilderness" part in your zone (see the "LOST" room flag). However, it must make sense. For instance, if there is a ginormous landmark visible from all over the place, not being able to navigate is ludicrous. (Like the gigantic pyramid in the Eastern Desert, for instance.) Also, this means that you shouldn't create one way exits unless they really do make sense. Second, your area has to make sense in the surrounding context of the world. This will require coordination with the NostalgiaMUD staff, of course, and you should include how you expect your area to fit overall when you pitch the idea. Consider how it will connect to the rest of the world and how travel to and from the area will work. Third, when building your rooms, you MUST NOT assume the player is travelling in a specific direction. The description MUST make sense no matter which direction the player arrived from. If you absolutely have to have a description specific to a particular arrival direction, this is a potentially valid use of asymmetric exits. However, that means you must have essentially identical rooms. These will be evaluated on a case by case basis. Be prepared to justify your choices here. If you can't justify it, it will be rejected. Fourth, your room descriptions are not the place to tell a story. They are not the place to say what the player thinks about the history of the area. They are there to describe the room and that description should be reasonably objective. It should also be as short as possible. It is reasonable to have extra text setting the mood of the area. The description should at least offer clues about all the possible exit directions except maybe secret ones. If you must have long tales told, add them as extra descriptions (say for a plaque or something). Remember, these will only be interesting the first time a player reads them. Do not force them on players needlessly. Fifth, do not try to duplicate the command entry interface to fake players out or to make them think they hit a death trap or anything like that. Remember that players can vary their own interface with colour settings, prompt modes, and the like. Such fake outs are just rude and always unnecessary. Don't do it. Period. It will be rejected. If you've managed to get past all of that and still think you want to build your area, put together a pitch for the NostalgiaMUD staff. That pitch should include what your area is, how you see it fitting into the overall world, what sort of level or play style you are targetting with it, and so on. As much detail as you have is good. Even if you don't have a specific idea, it's worth checking with the staff since they may have ideas for areas that can be built. Building an area on spec without checking with the staff first risks the entire concept being rejected out of hand. However, if you feel you must, go ahead. The staff is fairly easy going and the world of NostalgiaMUD doesn't adhere to a strict theme. To contact the staff about building, email nostalgiamud@l-w.ca or discuss the matter with the staff directly. BUILDING MECHANICS ================== Building areas for NostalgiaMUD is relatively straight forward. An area consists of one or more files that are loaded by the game at startup. Conventionally, rooms will be in a file with a .wld extension, mobs will be in a file with a .mob extension, and objects will be in a file with a .obj extension. Finally, there will usually be a file with a .zon extension which contains the zone reset information and naming. NostalgiaMUD does not require that files be separated in that fashion. It is perfectly acceptable to lump everything together into a single file. From this point, we will be discussing only "data files" rather than specific file types. Each data file contains one or more sections, each of which defines an object, mob, room, zone, etc. Each section contains a series of = pairs as appropriate for the type of section. A section is started by a header in the form [ ] which identifies the type of the section and the virtual number that is associated with it. A section continues until either a new section heading or the end of the file. A word on vnums. This is short for "virtual number" and is the canonical identifier used to reference the thing defined in a particular section. There is nothing magical about them, but they do need to be kept unique across the entire collection of like things. That is, there can only be one room with number 42, but there can be both a room and an object with the same number. By convention, a vnum range is allocated to a zone, which is the name for a collection of related objects, mobs, rooms, etc. Typically, a zone is assigned a range of vnums. Typically, zone XX will have the vnum range XX00 through XX99. However, this is not set in granite. By convention, all rooms in a zone are consecutively between the XX00 and XX99. Sections can be specified in any order in the data file. However, by convention, they are arranged in ascending order by vnum. The remainder of this document consists of three parts. The first part describes the different section types and the allowed keys for each one. The second lists the various values for flag sets and lists. The final section lists special notes that apply globally. DATA FILE SECTIONS ================== A note on formatting. Each value can consist of an arbitrary string. However, values are separated by commas for items that take multiple values. As a result, string values that contain commans need to be quoted by enclosing them in { and }. {} enclosed strings can also span multiple lines. To include a literal } inside a {} string, just write }}. There is another option for complex string values. This option is intended for scripting languages or runs of text that contain a lot of } characters. This is introduced by {:{ and closed by }:} with absolutely no whitespace or other characters interposed within the three character start and end sequences. There is no way to quote the end sequence. It is assumed that any use of this sequence will have a way to avoid writing a literal "}:}" anywhere in its contents. The basic {} string quoting can always be used if needed, of course. Rooms ----- A room section has a of "room". Rooms have the following keys available. title. This is the room title. The title is always shown when displaying a room (assuming the player can see), even in brief mode. It should be a short single line heading that gives a good idea what the room is. descr. This is the long description of the room. This should describe the local environment with clues about where various exits go as well other things that might be visible. However, care should be taken to avoid making these descriptions too long. A shorter long description is not necessarily a problem, especially if there is nothing to say. Also, the long description MUST NOT assume the player is travelling in any particular direction. Descriptions that say things like "the corridor continues" are just bad unless they make sense no matter what direction the player has arrived from. zone. This is the vnum of the zone this room belongs to. By convention it will be the base vnum of your range divided by 100. sector. This is the type of room. The sector type affects movement cost for for entering and exiting the room. It also affects whether sunset affects the ability to see. This takes a single value. flags. This is a flag list which identifies various features of the room, ranging from whether it is indoors to whether mobs are allowed to wander in. It is acceptable to leave this key out if no flags are relevant. extradesc. This takes two parameters, The first is the list of keywords that this description will be displayed for when provided to the "look" command. The second is the actual description which may be multiple lines. Any number of extradesc keys may be present, including none. In addition to the above, there are a number of "special" keys used for exit specifications. These are in the form of "exit[]." where is one of the supported directions (see the list section). The various direction keys are: dest. This is the vnum of the destination room. If this is not included, the exit will go nowhere. key. This is the key required to lock or unlock the door. If the exit is not a door, it makes no sense to specify it. If it is a door, leaving this out will mean there is no key. descr. This is what will show when "look " is used. If left out, then the "nothing special" notice will be shown. keyword. This is a keyword used for referencing the door. "look" will use it as will "open", "close", "lock", and "unlock". door. This specifies the type of door. This can be one of NORMAL for a normally open, unrestricted exit (which can still be closed by the zone reset or a special procedure), PICKABLE means it's a door that can be closed and locked, but can be picked if it is locked. ISDOOR means it's a door that can be closed and locked, but it cannot be picked if it is locked. IMM means it is an exit only visible to immortals. Prefixing it with a * suppresses any randomness introduced by the LOST room flag. Mobiles (mobs) -------------- First, a note on mob levels and difficulty. The higher the mob level, the harder it should be to kill. The damnodice, damsizedice, hitroll, damroll, affect flags, hit points, armour class, and wielded weapon all come into play here. In general, higher level mobs should hit harder, be harder to hit (lower armour class), hit harder (higher damroll, etc.), and so on. Most mobs shouldn't be higher than level 100. However, if you want to make a mob that is nearly impossible to kill or that needs a group of very high level players, levels up to about 120 are reasonable. However, mobs above level 100 should become harder at an alarming rate compared to mobs below level 100. So it is reasonable to give a mob at level 110 80000 hit points and a damroll of 80, a hitroll of 20, and affect it with sanctuary. In fact, this practice is encouraged for mobs that really shouldn't be killed. There really aren't any specific guidelines for stats to give a mob which is why extensive play testing should be done once the zone is connected and you must be prepared to adjust the stats if the staff requests it. A mob section has a of "mob". Each mob must have the following required keys specified. name. This is the name the mob is referred to by for "kill", "look", etc. This is really a keyword list with the words separated by whitespace. shortdescr. This is the "name" that appears when the mob is not in its default position. "the guard is standing here", "Otis the repairman is sleeping here", etc. longdescr. This is what appears when the mob is in its default position. This overrides all "standing", etc., bits that would ordinarily be shown. descr. This is the text shown when someone looks at the mob. alignment. The mob's alignment, from -1000 (full evil) to +1000 (full good). damnodice. The number of dice to roll to calculate bare hand damage. damsizedice. The size of the dice to roll to calculate bare hand damage. level. This is the mob's level. This is used for calculating the experience bonus for a kill and the strength of any spells or skills the mob uses as a result of a special procedure. This should be in the range of 0 through 120. Make sure the actual strength of the mob is realistic for the level specified. Specifying a mob at level 100 but with 10 hit points is a supremely bad idea. hit. This specifies the hit points. There are two formats, both of which are used to calculate the mob's actual hit points when it is instantiated in the game. The first is "xdy+z" which means to roll x dice of size y and then add z to that. The second is "x-y" which means to simply take a random number from x to y inclusive. In general, the higher the level of a mob, the higher the average value of this should be. A level 1 mob is reasonable to have 10 or so hit points. A level 100 mob should probably have thousands of hit points. Remember, the higher the level of a player, the harder they hit and the better the equipment they can obtain which also increases their damage. The hit point number for a mob at a given level will usually be substantially more than the equivalent player would have. defpos. This is the mob's default position. It is a single value from the position list. This is the position a mob will load in and is the position in which the "longdesc" key will show in a room occupant list. sex. This is the mob's sex. It will default to "neutral" but you should specify it for clarity, especially when the mob should naturally be male or female. The options are "NEUTRAL", "MALE", and "FEMALE". mobflags. These are various flags about the mob specifying characteristics such as its aggressiveness and whether it wanders around. See the mob flag list for more details. affflags. These are various "affect" flags that will be set for this mob. That allows enabling such things as a permanent sanctuary spell, or invisibilty, or similar. armour. This is the mob's armour class. You really should specify this. It ranges from -100 (best) to 100 (worst). The following keys are optional, and should probably not be provided for most mobs. hunger, thirst, drunk. The mob's hunger, thirst, and drunk levels. These are not very useful so it's probably just as well to never provide them. height. The height of the mob in centimetres. weight. The weight of the mob in pounds. (Yes, this is imperial while the height is metric.) damroll. This is the mob's damage roll. If not specified, it defaults to 0. This is exactly the same as damage roll for players. It is simply added to the damage calculated for a hit. hitroll. This is the mob's hitroll. If not specified, it defaults to 0. This is just like hitroll for players. exp. This is the amount of experience a mob has. This is not actually used for anything in the game so it is better to leave it out. If mob experience is ever made relevant, it will be calculated automatically based on mob level. gold. The amount of gold the mob is carrying. Defaults to 0. Make sure this makes sense for the mob in question. It really doesn't make sense for a small dog or a snake to be carrying more than a trivial amount of gold. int, wis, dex, con, str, cha. These are the usual stats, in the range of 1 to 25. If not specified, they default to 11. Ordinarily, you will not need to specify these. age. The mob's age. This doesn't really do anything so it's save to leave it out. Currently it is ignored. saves. These are saving throws (like for players) for various things. It takes five numbers for PARA, ROD, PETRI, BREATH, and SPELL. However, though the key is recognized, it currently doesn't do anything. Still, if you have a valid reason for a mob to have a better or worse than neutral saving throw, go ahead and specify this key. Objects ------- An object section has a of "object". Each object must have the following keys. keywords. These are the keywords used to reference an object. Having none makes it impossible to do anything with the object, including look at it. shortdesc. This is what shows for an object when it is in a list of things, like, say, a bag. longdesc. This is what shows when an object is laying on the ground. flags. These are various effects flags (hum, magic, etc.) attached to the object. useflags. This is a list of flags indicating how the object can be used or worn. For most objects, "TAKE" will be specified to indicate it can be picked up. However, leaving "TAKE" off means once the object is in a room somewhere, it stays there. weight. The weight of the object. value. The value of the object. Used for shops, etc. costperday. This key is recognized, but it isn't used for anything in Nostalgia because rent is free. extradesc. This is exactly the same as the extradesc key for rooms. It takes two parameters. The first is the keyword list and the second is the what is shown when one of the keywords is looked. Any number may appear. affect. This key may appear any number of times. It takes two parameters. The first is an "apply type" (see the list) and the second is the amount it modifies the value. affflags. This key may appear to have the object set various player affect flags when it is used. This should be used sparingly but might make sense for special objects to allow, say, detecting invisible things or magical objects, etc. type. This is the type of object (see the list). The remainder of the keys below must be specified AFTER the type key. These are type specific. Each key below has the type in () after it. text (NOTE). The text on the note. duration (LIGHT). How long the light burns before burning out. duration (FOOD). How long the food lasts after eating it. spelllevel (SCROLL,WAND,STAFF,POTION). The "level" of the spell(s) in the object. spells (SCROLL,POTION). Up to three spell names the object contains. spell (WAND,STAFF). A single spell associated with the object. maxcharges (WAND,STAFF). The maximum number of times the object can be charged to. charges (WAND,STAFF). The number of charges remaining in the object. damnodice (WEAPON). The number of dice to roll for weapon damage. damsizedice (WEAPON). The size of the dice to roll for weapon damage. weapontype (WEAPON). The type of weapon. See the weapon types list. acapply (ARMOUR). The amount subtracted from the users armour class when used. May be negative to make armour class worse. maxcontain (CONTAINER). The maximum weight that can be contained in the object. maxcontain (DRINKCON,FOUNTAIN). The maximum number of units of drink that can be contained. key (CONTAINER). The key used to lock and unlock the container. Like for doors. contflags (CONTAINER). Flags associated with containers. See list. contains (DRINKCON,FOUNTAIN). The current amount of druink contained. drinktype (DRINKCON,FOUNTAIN). The type of drink. See list. poisoned (DRINKCON,FOUNTAIN,FOOD). Whether the drink or food is poisoned. The value is either YES or NO. amount (MONEY). The number of gold coins in the "pile". Shops ----- A shop section has a of "shop". The following keys are supported. Note the "sell" and "buy" bits in the keys are from the *shop's* perspective. noitembuy. This is the message when the player doesn't have the item he is selling to the shop. noitemsell. This is the message when the shop doesn't have the item it is selling to the player. nocashbuy. When the shop can't affort to buy the item. nocashsell. When the player can't affort the item. nobuy. When the shop won't buy the item at all. sellitem. When the shop sells the item. %d is the amount paid. buyitem. When the shop buys an item. %d is the amount paid. nocashtemper. This doesn't actually do anything. It's a number. attacktemper. This doesn't actually do anything. It's a number. keeper. The vnum of the shopkeeper that needs to be present. roomnum. The vnum of the room where the shop operates. openat1, closeat1. When the shop opens and closes, early range. openat2, closeat2. When the shop opens and closes, late range. bankaccount. The amount the shop has in the bank. sellmult. This is a floating point value specifying the multiplier to the item value to get the price the shop sells things at. Usually > 1.0 buymult. This is the floating point value that is multiplied by the item value to get the amount the shop keeper pays for an item. Usually < 1.0. produces. One or more vnums for objects the shop produces, which is to say the objects it will never run out of. trades. A list of object types the shop will buy. Zones ----- A zone section has a type of "zone". The following keys appear in a zone section. name. This is the name of the zone as displayed in game and in log messages. top. This is the maximum room number that is considered part of the zone. Care should be taken to ensure this is consistent with the actual range of rooms in the zone. The bottom of a zone is identified as one higher than the highest room number in the next lowest numbered zone. reset. This is the number of minutes between zone resets. mode. This is the reset mode. This is either NEVER for never automatically resetting, "EMPTY" for only when there are no players present in the zone, and "ALWAYS" for resetting on the schedule regardless. script. This is the zone reset script. See below for information. Zone Reset Scripts ------------------ A zone reset script is a series of lines. Each line starts with a command code followed by an "if flag". If the "if flag" is nonzero, then the command in this line will not be executed if the previously executed command failed. The remainder of the parameters depend on the command. In the list below, the if flag is denoted by . is a room number, is an object number, is a mob number, is the maximum number allowed in the room, and is a maximum number allowed n the game. If the command is "*", that is a simple comment and is ignored. The commands are: A B These two are not yet implemented, They are exactly like M and O below except they also limit based on the number in the room. D Set to state . is a direction name and is "OPEN", "CLOSED", or "LOCKED". E . Equip the most recently loaded mob with an object in which is an equipment position (see list). G Give an object to the most recently loaded mob. M Load a mob to the specified room. O Load an object to the specified room. P Put the first object into the second object. The second object will be found by searching the object list for the first match, which will be the most recently loaded object of that number. R Remove an object with the specified number from a room. LISTS AND FLAGS =============== Directions ---------- Note that directions can be abbreviated just like movement commands in game. The shortest abbreviations are listed in parentheses. north (n) east (e) south (s) west (w) up (u) down (d) northeast (ne) southeast (se) southwest (sw) northwest (nw) Room Flags ---------- DARK - a light is always required DEATH - death trap - entering is fatal NO_MOB - mobs cannot wander in INDOORS - is inside; weather messages, etc., don't apply NO_MAGIC - magic doesn't work in the room PRIVATE - can't teleport in if more than 1 person is there GODROOM - can't even "goto" in for immortals LIGHT - room is always lit CHAOTIC - ??? PEACEFUL - healing occurs at a higher rate when present in this room LOST - when going in any of the supported directions, a random destination selected from all the existing directions is selected which may not be the original direction the player intended to go. Used to create maze type areas where a player is ostensibly lost. An exit with a door type prefixed by a "*" will suppress the random exit effect for that direction only. Sector Types ------------ The list of sectors and their associated base movement costs is: INSIDE - 1 CITY - 2 FIELD - 2 FOREST - 3 HILLS - 4 MOUNTAINS - 5 WATER (swimmable) - 4 WATER (boat required) - 1 HIGHWAY - 2 Equipment positions ------------------- LIGHT - a light you are using FINGER_R - right ring finger FINGER_L - left ring finger NECK_1 - around neck NECK_2 - second slot around neck BODY - on body HEAD - on head LEGS - on legs FEET - on feet HANDS - on hands ARMS - on arms SHIELD - used as shield ABOUT - about body (like a cloak) WAIST - around waist (belts, etc.) WRIST_R - right wrist WRIST_L - left wrist WIELD - used as weapon HOLD - held in hand Positions --------- While there are other positions, only these are valid for a mob! SLEEPING RESTING SITTING STANDING Affect flags ------------ Most of these are self explanatory. There are others, but these are the only ones that really make sense. BLIND INVISIBLE DETECT_EVIL DETECT_INVISIBLE DETECT_MAGIC SENSE_LIFE SANCTUARY CURSE POISON PROTECT_EVIL SLEEP SNEAK HIDE INFRARED Mob flags --------- SENTINEL - doesn't wander NICE_THIEF - doesn't attack thieves AGGRESSIVE - attacks passers by STAY_ZONE - won't wander out of the current zone WIMPY - will flee from a fight it is losing AGGRESSIVE_EVIL - will attack evil players AGGRESSIVE_GOOD - will attack good players AGGRESSIVE_NEUTRAL - will attack neutral players MEMORY - will remember who attacked and take revenge SCAVENGER - will pick up objects laying about RESTRICTWANDER - mob is restricted to a set of zones for wandering. The set of zones is specified by the allowzone and denyzone keys. Deny entries take precedence over allow entries. If combined with STAY_ZONE, allow entries can expand the wander range to include other nearby zones while still stricting the mob to the zone it happens to load in. Object types ------------ These are basically self explanatory. There are others, but these are the ones that make sense. LIGHT SCROLL WAND STAFF WEAPON TREASURE ARMOUR POTION WORN OTHER TRASH CONTAINER NOTE DRINKCON KEY FOOD MONEY PEN BOAT FOUNTAIN Usage flags ----------- These should be self explanatory. TAKE (can be picked up) FINGER NECK BODY HEAD LEGS FEET HANDS ARMS SHIELD ABOUT WAIST WRIST WIELD HOLD Object flags ------------ GLOW - item glows HUM - item hums EVIL - item is evil INVISIBLE - item is invisible MAGIC - item is magic NODROP - can't be dropped, donated, or junked BLESS - item is blessed ANTI_GOOD - can't be used by "good" characters ANTI_EVIL - can't be used by "evil" characters ANTI_NEUTRAL - can't be used by "neutral" characters NORENT - item can't be "rented" NODONATE - item can't be donated NOINVIS - item can't be made invisible Drink types ----------- WATER BEER WINE ALE DARKALE WHISKY LEMONADE FIREBRT (firebreather) LOCALSPC (local specialty) SLIME MILK TEA COFFEE BLOOD SALTWATER CLEARWATER Weapon types ------------ HIT BLUDGEON PIERCE SLASH BLAST WHIP NO_BS_PIERCE CLAW BITE STING CRUSH Apply types ----------- STR - strength DEX - dexterity INT - intelligence WIS - wisdom CON - constitution CHA - charisma CHAR_WEIGHT - weight CHAR_HEIGHT - height MANA - max mana HIT - max hit MOVE - max move AC or ARMOUR - armour class HITROLL - hitroll DAMROLL - damroll SAVING_PARA - save vs para SAVING_ROD - save vs rod SAVING_PETRI - save vs petri SAVING_BREATH - save vs breath SAVING_SPELL - save vs spell Spell names ----------- These should be self explanatory for the most part. Note that some spells don't make sense in wands, staffs, potions, or scrolls. There are others, but these are the ones are functional at the time of writing. ARMOUR TELEPORT BLESS BLINDNESS BURNING_HANDS CALL_LIGHTNING CHARM_PERSON CHILL_TOUCH COLOUR_SPRAY CONTROL_WEATHER CREATE_FOOD CREATE_WATER CURE_BLIND CURE_CRITIC CURE_LIGHT CURSE DETECT_EVIL DETECT_INVISIBLE DETECT_MAGIC DETECT_POISON DISPEL_EVIL EARTHQUAKE ENCHANT_WEAPON ENERGY_DRAIN FIREBALL HARM HEAL INVISIBLE LIGHTNING_BOLT MAGIC_MISSILE POISON PROTECT_FROM_EVIL REMOVE_CURSE SANCTUARY SHOCKING_GRASP SLEEP STRENGTH SUMMON VENTRILOQUATE WORD_OF_RECALL SENSE_LIFE IDENTIFY ADDITIONAL NOTES ================ Special Procedures ------------------ All objects, rooms, and mobs can have special procedures associated with them. If the key "specialname" is listed in the relevant data file section, the game will attempt to bind a function by that name to the object, mob, or room. This is the name of a C function. If the function isn't found, it will behave as though the special procedure wasn't requested. Data Values ----------- Objects, mobs, and rooms can hold arbitrary data values. These may be used as parameters to special procedures. An arbitrary number of data values can be specified. Each is specified as follows: datavalue=, is the lookup key used to fetch the value. It is a string. is the actual value. It is possible to have multiple values for a single key. However, only one value can be specified per "datavalue=" line.