emud/area_current/
emud/area_current/castle/
emud/area_current/newareas/
emud/area_current/nwcentral/
emud/area_current/scontinent/
emud/clans/
emud/player/
emud/player/d/e/bak/
emud/player/e/m/
emud/player/e/m/bak/
                               Storms of Times
                                                         _________
                                             __  __,----'         `-----.__
                      __                      \\/====-____          ___,-' `
                       \\          _/_/_/     /||\\       `---.____/
                ______---\       _- /   \/    |||  \\           _,'`
          __,--'   ,--'||\-_    /,--_/--.|-   |`\.  \\        ,'
       _,'      ,-'    |  \\`.  ` */ /==/-   /  ||   `\.     /
     .'       ,'       |   \\ \_**  /==/-   /   ||      \   /
    / _____  /   __    |     \\**-_/==/|- _/   ,//       \ /
   ,-'     `-|--'  `--_ \     ***-/===| \-_-===-'     _ _/`
                       `-| **** *|====|  \_      __,-- '
             ..          '* *** *|====|    \_  _,              /\
           ...             *** * \=====\__   \/                 \__  _
         ...             ***-' _/'\=,-' ____-'`-_                  `== \
     ()  *.   ()|       ** //--\   ///--\`._     `-                  _\ \
      #_/    /#_|   ()  /           \=======\      `----.________,--- __/
      #     / #    /#_/           __--======`)  \-._______________,---
     ###     / \  / #       |    //,--' `==--___ |-------'
    #####   /  /   / \     O##<_        //,--   -\
                  /  /       \

Emud ver 2.3 (Updated by Scandum - December 2002)
==============================================================================

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 the Emud configuration.

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.

emud.txt
    the latest set of values used by Emud.  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.

holygrove.are

    An example area, with mobile programs.

Don't be afraid to create, Scandum, the Dude of Fire

==============================================================================

Emud now uses OLC which I believe to be 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 list 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 imp 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.  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~


*** 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.

#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.


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>

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>

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
DDIR_NORTH
You spot the Second Room to the north, behind a large steel grate.~
grate steel~
1 QQ00 QQ01
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

  The first number is the zone number of this room; what zone should
  the mud consider this room to be in for game purposes.  Please see
  'zone numbers' in section 3 of this handbook.

  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, emud 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.

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

  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.


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.


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_DARK                1
ROOM_SMOKE               2
ROOM_NO_MOB              4   wandering mobiles can't enter the room
ROOM_INDOORS             8
ROOM_NO_GOHOME          32
ROOM_BANK              256
ROOM_PRIVATE           512   only two players at a time
ROOM_SAFE             1024
ROOM_SOLITARY         2048   only one player at a time
ROOM_PET_SHOP         4096   place to buy pets
ROOM_NO_RECALL        8192
ROOM_BLOCK           32768   room blocked from entrance
ROOM_NO_SAVE         65536
ROOM_MORGUE         131072   in this room are PC corpses sold
ROOM_ALTAR_N       1572864   able to set death room
ROOM_ALLOW_WAR     2097152
ROOM_ALLOW_GLA     4194304
ROOM_ALLOW_MAR     6291456
ROOM_ALLOW_NIN     8388608
ROOM_ALLOW_DRU    10485760
ROOM_ALLOW_SOR    12582912
ROOM_ALLOW_SHA    14680064
ROOM_NOTE_BOARD  134217728
ROOM_NO_CASTLE   268435456
ROOM_NO_RIP      536870912
ROOM_ALLOW_WLC  1073741824

These are complete for Emud v2.2.


*** SECTOR TYPES

The 'sector type' of a room controls how many movement points it costs to
enter that room.  This is not a flag type item: choose one, and use the
value...

SECT_INSIDE                   0
SECT_CITY                     1
SECT_FIELD                    2    (allows castles to be build)
SECT_FOREST                   3    (allows castles to be build)
SECT_HILLS                    4    (allows castles to be build)
SECT_MOUNTAIN                 5    (allows castles to be build)
SECT_WATER_SWIM               6
SECT_WATER_NOSWIM             7    (Requires a boat)
SECT_UNUSED                   8
SECT_AIR                      9    (Requires fly spell)
SECT_DESERT                  10
SECT_LAVA                    11    (Requires Fire breath spell)
SECT_INN                     12    (Heals the player while not on the game)
SECT_ETHEREAL                13    (Requires Ethereal Travel spell)
SECT_ASTRAL                  14    (Requires Astral Projection spell)
SECT_UNDERWATER              15    (Requires Breath water spell)
SECT_LEY_LINES               16    (Something undefined...)

*** 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
emud.  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 vague description of what the next room
might be, 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.

The door type can be the following values:

                 0   Standard hallway without door
EX_ISDOOR        1
EX_CLOSED        2
EX_LOCKED        4   Does not necessarily require a key */
EX_HIDDEN        8   cannot be seen without detect hidden
EX_PICKPROOF    32   only greater pick will open door
EX_BASHPROOF    64   cannot be bashed open
EX_MAGIC_PROOF 128   cannot be dissolved with unbarring ways

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.

Please note that adding a description for the door itself is usually done
under the 'extra descriptions' part of the room db.


*** 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.  Flying does not affect any aspect of the
    non-air types of sectors, with the assumption that.. dunno..

    it's a weird world we mud in :)


    The Marauder class has the climb ability that greatly increases the chance
    of safety for players in a cliff modified room.  The only other modifier is
    dexterity.  The longer a player stays on a cliff, the higher the likelyhood
    that they will fall.  The slope of a cliff is defined as 0 for a slight
    incline, to 10 for a vertical cliff face.  This number is ignored for
    SECT_AIR.  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 emud 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>~
<actions>
<affects>
<alignment> S
<level> <body part> <attack part> <hitpoints ?d?+?> <damage ?d?+?>
<gold> <race>
<loaded position> <default position> <sex>
[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.
~
131072|194|65536 8 100 S
1 4 16|8 1d6+2 1d4+0
10 2
7 7 0
---example precedes this line---

The following is the same example with the ascii version of the flags.

---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.
~
ACT_RACE|ACT_WIMPY|ACT_SCAVENGER|ACT_BODY
AFF_DETECT_INVIS 100 S
1 BODY_EYE BODY_TORSO|BODY_HIP 1d6+2 1d4+0
10 RACE_ELF
POS_STANDING POS_STANDING SEX_NEUTRAL
---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.

194 8 100 S

  The first number is the ACTION flag of the mob, which tell the mud how the
  mob should act.

  The second number is the AFFECTION 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 & AFFECTION FLAGS' below for more on both of these.

  The third number is the alignment of the mob, ranging from 1000 (good) to
  -1000 (evil).

  The 'S' stands for simple mob.  This feature is not used in Emud,
  and is left there as a placeholder.  Always use an 'S' here.
  This feature is used for backward compatibility.

1 20 10 1d6+2 1d4+0

  Field one is the mob's level.

  The second field is the body parts that can fall off when the mob dies.

  The third field is the body parts that attack.

  Field four is the mobs hit points.  There is more on Hitpoints and damage
  below in the aptly named 'HITPOINTS and DAMAGE'.

  The fifth field is how much damage a mob does with its bare hands.

10 2

  The first number is how much gold pieces this mob is carrying.

  The second field was used for exp on DIKU and Merc games, we ignore
  exp in files, and allow this field to define the race of the mobile
  if the action flags include ACT_RACE.

7 7 0

  The first and second number are the mob's loading and default position,
  respectively.  There is a section below: 'POSITIONS' that will explain
  more.

  The final number is the mob's gender; 0 is neuter, 1 is male, 2 is female.



*** 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_SENTINEL         2   Stays in one room
ACT_SCAVENGER        4   Picks up objects
ACT_DRUNK            8   Talks drunk
ACT_AGGRESSIVE      32   Attacks PC's
ACT_WIMPY          128   Flees when hurt
ACT_TRAIN          512   Can train PC's
ACT_PRACTICE      1024   Can practice PC's
ACT_WEAK          2048   Cannot carry anything
ACT_SMART         4096   Can say, normal can't
ACT_ONE_FIGHT     8192   Disapears after fight.
ACT_NO_ORDER     16384   Cannot be ordered.
ACT_BODY         65536   Allows body parts to function.
ACT_RACE        131072   Allows race to be defined.
ACT_UNDEAD      262144   Does not create corpse on death.



Affection 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 Emud.  It should always be an 'S'.  Originally it was to
    select Simple or Complex mobiles in Diku muds.  It is here to support
    backward compatibility.


*** BODY PARTS

    This field was used by Thac0 on Merc and Diku muds, but is ignored
    on Emud.  Therefore it can be used by a different value.  But you must
    give a flag to tell Emud 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.

    We advise selecting one or two body parts on all mobiles.

    Body parts are the parts that can be chopped off when the mobile dies.
    They will not show up elsewhere except in attack parts.  Body parts
    might give a slightly different version than attack parts, as in
    BODY_MOUTH, which is a jaw bone in body parts, and a bite in attack
    parts.  Any combination of body parts may be used, and it does not
    necessarily have to match the attack parts.  Only one is selected when
    the body part is chopped off with a 25% chance that the body part will
    even fall off.  It is not suggested to select two arms, as this will
    cause an error, only one is required.

    Below are the flags and spams for body parts listed.

BODY_HEAD       $n's head slowly falls off.
BODY_MOUTH      $n's jaw drops to the floor.
BODY_EYE        $n's eyeball pops out.
BODY_TORSO      $n is broken into pieces.
BODY_HIP        $n falls to pieces.
BODY_LEG        $n kicks $s leg off.
BODY_ARM        $n's arm seems to have been unattached.
BODY_WING       $n is flying nowhere.
BODY_TAIL       $n can no longer wag $s tail.
BODY_TENTICLE   $n's tenticle gushes bloody.
BODY_HORN       $n's horn bumps you as it falls to the floor.
BODY_CLAW       The claw of $n gets clipped.
BODY_HAND       $n gives you the finger, right before losing $s hand.
BODY_FOOT       $n stumbles, as $s foot falls off.



***  ATTACK PARTS

    This field was originally AC on Diku and Merc muds.  This field is
    normally ignored on Emud, 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.

    Note:  AC, or Armor Class is computed by the game itself, and is
    dependant on the level of the mobile.  If the mobile is should
    normally be wearing armor, the armor will add 2/3 of it's normal
    AC bonus.  If the mobile is not weaing armor, and is normally
    supposed to be wearing armor, then the AC of the mobile is
    1/3 of the value of the armor less than the normal AC for a
    mobile of the same level.

Below are the flags and spams for attack parts listed.

BODY_HEAD       head butt
BODY_MOUTH      bite
BODY_EYE        evil-eye
BODY_TORSO      shoulder slam
BODY_HIP        hip slam
BODY_LEG        knee
BODY_ARM        elbow slam
BODY_WING       flap
BODY_TAIL       tail slap
BODY_TENTICLE   tenticle whip
BODY_HORN       horn jab
BODY_CLAW       claw
BODY_HAND       punch
BODY_FOOT       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 mobile will do it's basic damage plus one-half
    of the damage of the weapon wielded.

Standards and Measures

    These are the suggested strengths of mobs.


    level 60 mobs or lower :

    minimum hitpoints : 10 + level * level * 0.5
    maximum hitpoints : 20 + level * level * 1.5

    minimum damage    :  2 + level * 0.5
    maximum damage    :  5 + level * 3.0


    level 61 mobs and higher :

    minimum hitpoints : level * level * 0.7
    maximum hitpoints : level * level * 1.5

    minimum damage    : level * 0.7
    maximum damage    : level * 3.00

These values are checked with the areacheck tool by the emud admins.


*** 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

    This field was previously used for exp for the mobile, but Emud calculates
    exp based on the level of the mobile.  This leaves the field open for more
    important things:  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 will also
    allow mobprogs to be used based on race.  You must pick a race which is one
    of the basic 29, even if the mobile should be something outside of those
    defined.  Just pick the closest one.


*** POSITION

    A mob always has two position numbers: its loading position,
    and its default position.  A mob will be loaded into its loading
    position initially, and after fighting, will return to its default
    position.  Note that these do not have to be the same, but usually
    are.

    The valid positions are:

POS_SLEEPING  4
POS_RESTING   5
POS_FIGHTING  6
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 Barbarian 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.
~
5
64|16384 8193
0 3 1 10
5 1000 10
E
example~
This is a rather boring example.
~
A 1 1

C
slash~
1
---example precedes this line---

The following is the same object using the ascii flags system:
---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
ITEM_FLAG_MAGIC|ITEM_FLAG_LEVEL
ITEM_WEAR_WIELD|ITEM_WEAR_WIELD
0 3 1 10
5 1000 10
E
example~
This is a rather boring example.
~
A APPLY_STR 1

C
slash~
FLAG_CLASS_WARRIOR
---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 Emud, 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

5
    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_TREASURE            8
ITEM_TYPE_ARMOR               9
ITEM_TYPE_POTION             10
ITEM_TYPE_FURNITURE          12
ITEM_TYPE_TRASH              13
ITEM_TYPE_CONTAINER          15
ITEM_TYPE_DRINK_CON          17
ITEM_TYPE_KEY                18
ITEM_TYPE_FOOD               19
ITEM_TYPE_MONEY              20
ITEM_TYPE_BOAT               22
ITEM_TYPE_FOUNTAIN           25
ITEM_TYPE_PILL               26
ITEM_TYPE_AMMO               30

*** Object Flags

64|16384

    This determines what is affecting the object.  Also note the
    ITEM_FLAG_LEVEL is required on Emud.  This is a flag that lets
    the field of the level work.  If this flag is not set, the level
    field is ignored, and item level might be calculated incorrect.


*** OBJECT FLAGS

ITEM_FLAG_GLOW                1
ITEM_FLAG_HUM                 2
ITEM_FLAG_DARK                4
ITEM_FLAG_LOCK                8
ITEM_FLAG_EVIL               16
ITEM_FLAG_INVIS              32
ITEM_FLAG_MAGIC              64  /* Auto set if any affects exist */
ITEM_FLAG_NODROP            128
ITEM_FLAG_ANTI_GOOD         512
ITEM_FLAG_ANTI_EVIL        1024
ITEM_FLAG_ANTI_NEUTRAL     2048
ITEM_FLAG_NOREMOVE         4096
ITEM_FLAG_INVENTORY        8192
ITEM_FLAG_LEVEL           16384  /* Absolutely required on Emud */
ITEM_FLAG_AUTO_ENGRAVE    65536  /* This item is engraved to first to get */


*** Wear Flags
8193

    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

ITEM_WEAR_TAKE                1  /* Required for the player to get object */
ITEM_WEAR_FINGER              2
ITEM_WEAR_NECK                4
ITEM_WEAR_BODY                8
ITEM_WEAR_HEAD               16
ITEM_WEAR_LEGS               32
ITEM_WEAR_FEET               64
ITEM_WEAR_HANDS             128
ITEM_WEAR_ARMS              256
ITEM_WEAR_SHIELD            512
ITEM_WEAR_ABOUT            1024
ITEM_WEAR_WAIST            2048
ITEM_WEAR_WRIST            4096
ITEM_WEAR_WIELD            8192
ITEM_WEAR_HOLD            16384

*** Object Values

0 3 1 10

    These are the object's values.  What each number means is completely
    dependant on what Type of object it is.

*** OBJECT VALUES

    The four numbers consisting of the 'item values' are different
    for each type of item.  Below the meanings of these numbers are broken
    down by each type.  Zeroes refer to fields not used, while letters are
    explained for each section...

    please note this is basically lifted verbatim from the dikudocs.
    Credits to the original authors, and no disrespect intended.

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]: Which spell
Value[3]: Which spell
          The values(1-3) are three (or less) different spells, mixed 'on'
          the scroll.  Unused spells should be set to -1.

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)

ITEM_WEAPON (5)
Value[0]: Type of ammo shot by the weapon (0 if not a range weapon)
Value[1]: Number of dice to roll for damage (keep this number low)
Value[2]: Size of dice to roll for damage
Value[3]: The weapon type. Type is one of:

          NAME          NUMBER CATEGORY   Message type
          --------------------------------------------------------------------
          WEAPON_SLICE     1  : Slice      Slice
          WEAPON_STAB      2  : Stab       Stab   (throw, backstab)
          WEAPON_SLASH     3  : Slash      Slash
          WEAPON_WHIP      4  : Whip       Whip
          WEAPON_CLAW      5  : Claw       Claw
          WEAPON_BLAST     6  : Blast      Blast
          WEAPON_POUND     7  : Pound      Pound  (throw)
          WEAPON_CRUSH     8  : Crush      Crush  (throw)
          WEAPON_GREP      9  : Grep       Grep
          WEAPON_BITE     10  : Bite       Bite
          WEAPON_PIERCE   11  : Pierce     Pierce (throw, backstab)

          To make a ranged weapon, you must also create ammo for it.
          A ranged weapon is defined by including the vnum of the ammo
          in Value[0] of the weapon.  If a '0' is used here, it is not
          a shooting weapon.

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)
Value[2]: Which spell
Value[3]: Which spell
          Unused spells should be set to -1.

          Eg.
          Value 0 : 30  (Level)
          Value 1 : 27  (Harm)
          Value 2 : 17  (Curse)
          Value 3 : -1  (no-spell)

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:
          CONT_CLOSEABLE     1
          CONT_PICKPROOF     2
          CONT_CLOSED        4
          CONT_LOCKED        8
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
    ITEM_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                     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_WARRIOR

    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 warriors.

    List of flags of classes

FLAG_CLASS_WARRIOR           1
FLAG_CLASS_GLADIATOR         2
FLAG_CLASS_MARAUDER          4
FLAG_CLASS_NINJA             8
FLAG_CLASS_DRUID            16
FLAG_CLASS_SORCERER         32
FLAG_CLASS_SHAMAN           64
FLAG_CLASS_WARLOCK         128

    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_WARRIOR     - The amount of war levels
    OIF_MCLASS_GLADIATOR   - The amount of Gla levels
    OIF_MCLASS_MARAUDER    - The amount of Mar levels
    OIF_MCLASS_NINJA       - The amount of nin levels
    OIF_MCLASS_DRUID       - The amount of dru levels
    OIF_MCLASS_SORCERER    - The amount of sor levels
    OIF_MCLASS_SHAMAN      - The amount of sha levels
    OIF_MCLASS_WARLOCK     - 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 ITEM_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.  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.


*** speech_prog <ARGUMENT>

    The argument is the same as for an act_prog.  This works best when only
    one word is used as the argument, as several can cause the mob_prog to
    trigger several times in a row.

    Example

    >speech_prog the dog~
    The previous example is faulty, because it would trigger twice if the
    player said the words 'the' and 'dog' in the same sentence.

    Correct 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.

    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.


*** rand_prog <NUMBER>

    The argument is a number betweeen 1 and 100 inclusive.

    This trigger is checked at each PULSE_MOBILE and if the argument is
    greater than a percentage roll the trigger is activated. This
    will happen even if there is no PC in the room with the mob.

    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.


*** fight_prog <NUMBER>

    The argument is a percentage like in rand_prog.

    Useful for giving mobiles combat attitude.  It is checked every
    PULSE_VIOLENCE when the mobile is fighting.  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 pulse.


*** hitprcnt_prog <NUMBER>

    The argument is a percentage.

    Is activated at each PULSE_VIOLENCE 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.

*** 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.


*** all_greet_prog <NUMBER>

    Again a percentage argument.

    Like greet_prog, but it can be triggered even if the mobile didnt
    see the arrival (stealth, invis). Most useful for faking teleport
    rooms (if your mobiles can transfer) or for impassable guardians.

    Neither greet_prog is activated if the mobile is fighting.

    Do aknowledge that a mobile with detect_invis and detect_hidden
    will always trigger with a normal greet_prog.  Unless it has been
    blinded.  It is advised to use greet_prog to simulate more natural
    behavior, and use the all_greet_prog for mobiles without detection
    who still need to trigger. Or for ethereal mobs who don't need
    detects for the kind of greet program you have in mind.


*** 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.


*** give_prog <ARGUMENT>

    This command should always be used with the 'I' format for item vnums.

    Example

    A scroll of recall is vnum 9720, so use 'I9720' for the argument.

    >give_prog I9720~

    This is triggered whenever something is given to the mobile.  Best used
    for quests.


*** 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.

    If money is given to a mobile with this trigger type, instead of the
    cash being added to mob->gold, the mobile is instead given a pile of
    coins in the proper amount. In this way, the mobile can drop the coins
    or refer to the pile of gold by I3 (item vnum is 3). And use $O to print
    the short description: "%d gold coins".


*** 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 your 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 rand   (number)                  Is rand percentage less or equal to number
if isnpc      ($*)                  Hardly used since most triggers only work
if ispc       ($*)                  on players
if isgood     ($*)
if isevil     ($*)
if isneutral  ($*)
if iskiller   ($*)
if isthief    ($*)
if isfight    ($*)                  Is $* fighting
if isfollow   ($*)                  Is $* a follower with master in same room
if hitprcnt   ($*)  == percent      Checks percentage of hitpoints left
if inroom     ($*)  == vnum
if isaffected ($*)  == bitvector
if sex        ($*)  == bitvector
if position   ($*)  == bitvector
if class      ($*)  == bitvector
if race       ($*)  == bitvector
if whichgod   ($*)  == bitvector
if level      ($*)  == integer
if goldamt    ($*)  == integer
if objtype    ($*)  == bitvector
if objval0    ($*)  == integer
if objval1    ($*)  == integer
if objval2    ($*)  == integer
if objval3    ($*)  == integer
if number     ($*)  == integer      Is the vnum of $* equal to integer
if name       ($*)  == string
if time       ()    == integer
if shotfrom   ($i)  == string       Used for range_prog
if objtype    ($*)  == bitvector
if objval0    ($*)  == integer
if objval1    ($*)  == integer
if objval2    ($*)  == integer
if objval3    ($*)  == integer
if number     ($*)  == integer      Is the vnum of $* equal to integer
if hasobj     (name)                sets $c and $C variable
if hasobjnum  (vNum)                sets $c and $C variable
if actorhasobjnum   (vNum)          sets $c and $C variable
if actorwearsobjnum (vNum)          sets $c and $C variable 
if quest    (B,N,$*)  == integer    B = Offset, N = Numbits, R = Room vnum
if questr (R,B,N,$*)  == integer
if objquest (B,N,$*)  == integer
if pcsinarea ([vnum]) == integer
if pcsinroom ()       == integer
if existsroom  (name)               searches for matching object or mob
if existsarea  (name)
if existsworld (name)

------------------------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:

*** 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.


*** 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.


*** 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.


*** 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.


*** 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.


*** MPMSET <victim> <field>  <argument>
*** MPMSET <victim> <string> <argument>

    Field being one of:
      level gold align thirst drunk full exp quest questr randquest randquestr
    String being one of:
      name short long title

    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 make a diguise for a player, change the string of LONG to what you want
    to disguise the player as.  To return the player to it's normal state, use
    the value of NULL.

    Example:

    mpmset $n long There is a small boy here.
    (disguise the player as a small boy)
    mpmset $n long null
    (returns the player to normal)


*** MPMADD <victim> <field> <argument>

    Field being one of:
      level gold align thirst drunk full exp currhp currmana currmove
      hp mana move quest questr

    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>

    Field being one of:
      value0 value1 value2 value3 extra setextra clrextra wear level weight
      cost timer quest randquest
    String being one of:
      name short long ed

    quest and randquest have additional parameters:

    mposet <object> quest     <firstBit> <numBits> <newValue>
    mposet <object> randquest <firstBit> <numBits>


*** MPOADD <object> <field> <argument>

    Field being one of:
      value0 value1 value2 value3 level weight cost timer quest

    quest has additional parameters:

    mpoadd <object> quest <firstBit> <numBits> <value>


*** MPASET <object> <field> <argument>

    Field being one of:
      str dex int wis con mana hp move ac damroll hitroll
      para rod petri breath spell

    This command allows you to permanently add affects to objects.


*** 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     --     --     --
him/her/it         $l     $m     $M     $L     --     --     --
his/hers/its       $k     $s     $S     $K     --     --     --
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: "emud.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_ONE_FIGHT

===============================================================================

  Mobile Affects

  AFF_DETECT_HIDDEN        AFF_ETHEREAL             AFF_UNDERSTAND
  AFF_DETECT_INVIS         AFF_INVISIBLE            AFF_TONGUES
  AFF_PROTECT_EVIL         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            AFF_CLEAR

===============================================================================

  Mobile Genders

  SEX_NEUTRAL                SEX_MALE                 SEX_FEMALE

===============================================================================

  Body Parts

  BODY_HEAD           BODY_LEG                      BODY_HORN
  BODY_MOUTH          BODY_ARM                      BODY_CLAW
  BODY_EYE            BODY_WING                     BODY_HAND
  BODY_TORSO          BODY_TAIL                     BODY_FOOT
  BODY_HIP            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

  ITEM_FLAG_HUM            ITEM_FLAG_BLESS          ITEM_FLAG_INVENTORY
  ITEM_FLAG_EVIL           ITEM_FLAG_ANTI_NEUTRAL   ITEM_FLAG_LEVEL
  ITEM_FLAG_INVIS          ITEM_FLAG_ANTI_GOOD      ITEM_FLAG_AUTO_ENGRAVE
  ITEM_FLAG_MAGIC          ITEM_FLAG_ANTI_EVIL      ITEM_FLAG_GLOW
  ITEM_FLAG_NODROP         ITEM_FLAG_NOREMOVE

===============================================================================

  Wear Locations

  ITEM_WEAR_TAKE           ITEM_WEAR_LEGS           ITEM_WEAR_ABOUT
  ITEM_WEAR_FINGER         ITEM_WEAR_FEET           ITEM_WEAR_WAIST
  ITEM_WEAR_NECK           ITEM_WEAR_HANDS          ITEM_WEAR_WRIST
  ITEM_WEAR_BODY           ITEM_WEAR_ARMS           ITEM_WEAR_WIELD
  ITEM_WEAR_HEAD           ITEM_WEAR_SHIELD         ITEM_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                 APPLY_SAVING_BREATH
  APPLY_CON                APPLY_HITROLL            APPLY_SAVING_SPELL
  APPLY_SEX                APPLY_DAMROLL

===============================================================================

  Object Classes

  FLAG_CLASS_WARRIOR       FLAG_CLASS_NINJA         FLAG_CLASS_SHAMAN
  FLAG_CLASS_GLADIATOR     FLAG_CLASS_DRUID         FLAG_CLASS_WARLOCK
  FLAG_CLASS_MARAUDER      FLAG_CLASS_SORCERER

===============================================================================

  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_SMOKE               ROOM_SOLITARY            ROOM_NO_GOHOME
  ROOM_INDOORS             ROOM_ALLOW_WAR           ROOM_NO_RECALL
  ROOM_SAFE                ROOM_ALLOW_GLA           ROOM_NO_SAVE
  ROOM_BANK                ROOM_ALLOW_MAR           ROOM_NO_CASTLE
  ROOM_PET_SHOP            ROOM_ALLOW_NIN           ROOM_NO_RIP
  ROOM_MORGUE              ROOM_ALLOW_DRU
  ROOM_ALTAR_N             ROOM_ALLOW_SOR
  ROOM_NOTE_BOARD          ROOM_ALLOW_SHA
  ROOM_BLOCK               ROOM_ALLOW_WLC

===============================================================================

  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_WARRIOR            CLASS_NINJA              CLASS_WARLOCK
  CLASS_GLADIATOR          CLASS_DRUID
  CLASS_MARAUDER           CLASS_SORCERER

===============================================================================

  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: "spells.txt"

  SPELL_NONE
  SPELL_ACID_BLAST
  SPELL_ACID_BREATH
  SPELL_ANIMATE_DEAD
  SPELL_ANTI_MAGIC_SHELL
  SPELL_ARMOR
  SPELL_ASTRAL_PROJECTION
  SPELL_BANISH
  SPELL_BENEDICTION
  SPELL_BLESS
  SPELL_BLINDNESS
  SPELL_BLOCK_AREA
  SPELL_BREATH_WATER
  SPELL_BREW_POTION
  SPELL_BURNING_HANDS
  SPELL_CALL_LIGHTNING
  SPELL_CAUSE_CRITICAL
  SPELL_CAUSE_LIGHT
  SPELL_CAUSE_SERIOUS
  SPELL_CHANGE_SEX
  SPELL_CHARM_PERSON
  SPELL_CHILL_TOUCH
  SPELL_COLOUR_SPRAY
  SPELL_CONFUSION
  SPELL_CONTINUAL_LIGHT
  SPELL_CONTROL_WEATHER
  SPELL_CREATE_FOOD
  SPELL_CREATE_SPRING
  SPELL_CREATE_WATER
  SPELL_CURE_BLINDNESS
  SPELL_CURE_CRITICAL
  SPELL_CURE_LIGHT
  SPELL_CURE_POISON
  SPELL_CURE_SERIOUS
  SPELL_CURSE
  SPELL_DEMON
  SPELL_DETECT_EVIL
  SPELL_DETECT_HIDDEN
  SPELL_DETECT_INVIS
  SPELL_DETECT_MAGIC
  SPELL_DETECT_POISON
  SPELL_DISPEL_EVIL
  SPELL_DISPEL_GOOD
  SPELL_DISPEL_MAGIC
  SPELL_DISPEL_UNDEAD
  SPELL_EARTHQUAKE
  SPELL_ELEMENTAL
  SPELL_ENCHANT_WEAPON
  SPELL_ENERGY_DRAIN
  SPELL_ENERGY_SHIFT
  SPELL_ENHANCED_HEAL
  SPELL_ENHANCED_REST
  SPELL_ENHANCED_REVIVE
  SPELL_ENHANCE_OBJECT
  SPELL_ETHEREAL_TRAVEL
  SPELL_FAERIE_FIRE
  SPELL_FAERIE_FOG
  SPELL_FARHEAL
  SPELL_FEAST
  SPELL_FIREBALL
  SPELL_FIRESHIELD
  SPELL_FIRE_BREATH
  SPELL_FLAMESTRIKE
  SPELL_FLY
  SPELL_FROST_BREATH
  SPELL_GATE
  SPELL_GAS_BREATH
  SPELL_GENERAL_PURPOSE
  SPELL_GIANT_STRENGTH
  SPELL_HALLUCINATE
  SPELL_HALLUCINATORY_TERRAIN
  SPELL_HARM
  SPELL_HASTE
  SPELL_HEAL
  SPELL_HIGH_EXPLOSIVE
  SPELL_HOLY_WORD
  SPELL_HOMONCULOUS
  SPELL_IDENTIFY
  SPELL_ILLUSION
  SPELL_IMPROVED_INVIS
  SPELL_INDUCTION
  SPELL_INFRAVISION
  SPELL_INVIGORATE
  SPELL_INVIS
  SPELL_KNOW_ALIGNMENT
  SPELL_LIGHTNING_BOLT
  SPELL_LIGHTNING_BREATH
  SPELL_LOCATE_OBJECT
  SPELL_MAGE_BLAST
  SPELL_MAGE_SHIELD
  SPELL_MAGIC_MISSILE
  SPELL_MASS_INVIS
  SPELL_MIRROR_IMAGE
  SPELL_NIGHTMARE
  SPELL_OBJECT_INVIS
  SPELL_PASS_DOOR
  SPELL_PHANTASM
  SPELL_POISON
  SPELL_POSSESS
  SPELL_PROTECTION_EVIL
  SPELL_PROTECTION_GOOD
  SPELL_HALLUCINATE
  SPELL_HALLUCINATORY_TERRAIN
  SPELL_HARM
  SPELL_HASTE
  SPELL_HEAL
  SPELL_HIGH_EXPLOSIVE
  SPELL_HOLY_WORD
  SPELL_HOMONCULOUS
  SPELL_IDENTIFY
  SPELL_ILLUSION
  SPELL_IMPROVED_INVIS
  SPELL_INDUCTION
  SPELL_INFRAVISION
  SPELL_INVIGORATE
  SPELL_INVIS
  SPELL_KNOW_ALIGNMENT
  SPELL_LIGHTNING_BOLT
  SPELL_LIGHTNING_BREATH
  SPELL_LOCATE_OBJECT
  SPELL_MAGE_BLAST
  SPELL_MAGE_SHIELD
  SPELL_MAGIC_MISSILE
  SPELL_MASS_INVIS
  SPELL_MIRROR_IMAGE
  SPELL_NIGHTMARE
  SPELL_OBJECT_INVIS
  SPELL_PASS_DOOR
  SPELL_PHANTASM
  SPELL_POISON
  SPELL_POSSESS
  SPELL_PROTECTION_EVIL
  SPELL_PROTECTION_GOOD
  SPELL_RECHARGE
  SPELL_REFRESH
  SPELL_REMOVE_CURSE
  SPELL_REMOVE_FEAR
  SPELL_RESTORE
  SPELL_RIFT
  SPELL_RIGHTEOUS_FURY
  SPELL_RIP
  SPELL_SANCTIFY
  SPELL_SANCTUARY
  SPELL_SHADOW
  SPELL_SHADE
  SPELL_SHIELD
  SPELL_SHOCKING_GRASP
  SPELL_SLEEP
  SPELL_SLOW
  SPELL_SMOKE
  SPELL_SOUTHING_TOUCH
  SPELL_STABILITY
  SPELL_STONE_SKIN
  SPELL_SUMMON
  SPELL_TELEPORT
  SPELL_TONGUES
  SPELL_TRANSPORT
  SPELL_TREMOR
  SPELL_TRUESIGHT
  SPELL_TELEPORT
  SPELL_TONGUES
  SPELL_TRANSPORT
  SPELL_TREMOR
  SPELL_TRUESIGHT
  SPELL_UNBARRING_WAYS
  SPELL_UNDERSTAND
  SPELL_UNHOLY_WORD
  SPELL_VENTRILOQUATE
  SPELL_VAMPIRIC_TOUCH
  SPELL_WEAKEN
  SPELL_WORD_OF_RECALL
  SPELL_WRITE_SPELL


==============================================================================
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|BODY_ARM BODY_HAND|BODY_ARM 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|BODY_FOOT|BODY_ARM BODY_HAND|BODY_FOOT|BODY_ARM 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_ARM|BODY_HAND|BODY_FOOT BODY_ARM|BODY_HAND|BODY_FOOT 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_LEG BODY_HORN|BODY_LEG 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 BODY_FOOT 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 BODY_WING|BODY_TAIL|BODY_CLAW 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
ITEM_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
ITEM_FLAG_LEVEL
ITEM_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
ITEM_FLAG_LEVEL
ITEM_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
ITEM_FLAG_LEVEL
ITEM_WEAR_HOLD|ITEM_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
ITEM_FLAG_LEVEL
ITEM_WEAR_HOLD|ITEM_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
ITEM_FLAG_ANTI_EVIL|ITEM_FLAG_LEVEL
ITEM_WEAR_WIELD|ITEM_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
ITEM_FLAG_ANTI_EVIL|ITEM_FLAG_LEVEL|ITEM_FLAG_MAGIC
ITEM_WEAR_TAKE|ITEM_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
ITEM_FLAG_LEVEL|ITEM_FLAG_MAGIC
ITEM_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
ITEM_FLAG_LEVEL|ITEM_FLAG_MAGIC
ITEM_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
ITEM_FLAG_LEVEL
ITEM_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
ITEM_FLAG_MAGIC|ITEM_FLAG_LEVEL
ITEM_WEAR_TAKE
10 SPELL_UNDERSTAND 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
ITEM_FLAG_MAGIC|ITEM_FLAG_LEVEL
ITEM_WEAR_TAKE
15 SPELL_DETECT_INVIS SPELL_DETECT_HIDDEN 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
ITEM_FLAG_LEVEL
ITEM_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
ITEM_FLAG_MAGIC|ITEM_FLAG_LEVEL
ITEM_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
ITEM_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
ITEM_FLAG_LEVEL
0
24 0 0 0
0 10 1
#QQ22
ivy~
some ivy~
Some ivy is here.~
~
ITEM_TYPE_PILL
ITEM_FLAG_LEVEL
ITEM_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
ITEM_FLAG_LEVEL
ITEM_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
ITEM_FLAG_LEVEL
ITEM_WEAR_WAIST|ITEM_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
ITEM_FLAG_LEVEL
ITEM_WEAR_NECK|ITEM_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
ITEM_FLAG_ANTI_EVIL|ITEM_FLAG_MAGIC|ITEM_FLAG_LEVEL
ITEM_WEAR_ARMS|ITEM_WEAR_TAKE|ITEM_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
ITEM_FLAG_GLOW|ITEM_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
ITEM_FLAG_GLOW|ITEM_FLAG_LEVEL
ITEM_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
ITEM_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
ITEM_FLAG_LEVEL
ITEM_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


#$