For Monster version 1.06

MONSTER

  Monster, a multiplayer adventure game where the players create the 
  world and make the rules.

  Command: MONSTER/qualifiers [dump_file]

Additional information available:

Parameters General_Qualifiers /VERSION /START /OUTPUT
Management_Qualifiers /REBUILD /FIX /DEBUG /REAL_USERID
/BATCH /BUILD /DUMP Playing_Qualifiers /USERID
/WHO Initialization_file Installation Original Commands
Editing MDL Fixing_Database

Parameters


 dump_file
  
  Only with /DUMP or /BUILD -qualifiers.

  This parameter specifies the text form equivalent of a database.  Default 
  extension is .DMP.  This parameter is required with the qualifiers /DUMP 
  and /BUILD. 
  

General_Qualifiers


/VERSION

 /VERSION
  Shows the version text.  The /VERSION qualifier shows the same  text 
  when playing Monster.

  Incompatible with /WHO.

/START

 /START
 /NOSTART
  Prevents or enables the start of playing after handling of other 
  qualifiers. Useful with /VERSION.

  Incompatible with /WHO, /DUMP and /BUILD.

/OUTPUT

 /OUTPUT[=output-file-spec]
 /NOOUTPUT
  Redirects Monster's output to a file. Useful with /VERSION or 
  management qualifiers.

  Incompatible with /FIX, /WHO, /DUMP and /BUILD.

Management_Qualifiers


  These qualifiers are only for Monster Manager.

/REBUILD

 /REBUILD
  Builds a new database for Monster. Checks first the entries  of 
  MONSTER.INIT -file.

  Incompatible with /FIX, /REAL_USERID, /USERID, /BATCH, /WHO, /DUMP
  and /BUILD.

/FIX

 /FIX
  Activates the fixing system in the interactive mode. With it 
  Monster Manager can fix errors of database.

  Incompatible with /OUTPUT, /REBUILD, /REAL_USERID, /USERID, /BATCH, 
  /WHO, /DUMP and /BUILD.

  See also Fixing_Database.

/DEBUG

 /DEBUG
 /NODEBUG (D)
  Switches the debug mode on or off. Equivalent to the DEBUG command when
  playing Monster.

  Incompatible with /WHO.

/REAL_USERID

 /REAL_USERID
  Enables playing with another player's name.

  Incompatible with /REBUILD, /FIX, /USERID, /BATCH, /WHO, /DUMP and 
  /BUILD.

/BATCH

 /BATCH=command-file-spec
  Runs the fixing system in the batch mode. 

  Incompatible with /REBUILD, /FIX,  /REAL_USERID,  /USERID, /BATCH, 
  /WHO, /DUMP and /BUILD.

/BUILD

 /BUILD
  Nearly the same as /REBUILD: reads the database from a special text 
  file. The dump_file parameter is required with this qualifier.

  See also /DUMP.

  Incompatible with /REBUILD, /FIX, /REAL_USERID,  /USERID,  /BATCH, 
  /BUILD, /OUTPUT and /START.

/DUMP

  /DUMP
   Creates a text form copy of the database for /BUILDing. The dump_file
   parameter is required with this qualifier.

   Incompatible with /REBUILD, /FIX, /REAL_USERID,  /USERID,  /BATCH, 
   /DUMP, /OUTPUT and /START.

Playing_Qualifiers


/USERID

 /USERID=virtual_userid
  Enables playing with a virtual userid. Virtual userids are independent 
  of real userids. They are protected with passwords. 

  Incompatible with   /REBUILD,  /FIX,  /REAL_USERID,  /BATCH,  /WHO, 
  /DUMP and /BUILD.

/WHO

 /WHO
  Shows players currently playing Monster, but not those starting it.
  Ideal for LOGIN.COM.                                        

  Incompatible with other qualifiers.

Initialization_file


  Monster reads a file named MONSTER.INIT from the directory where the 
  executable Monster program is. Monster finds out the directory from  
  the process image_name entry. There are the following entries:

Additional information available:

MM_userid gen_debug REBUILD_OK root coderoot
LEVELTABLE Archpriv Archhealth Archfactor Archpower
maxexperience protect_exp Playtime default_allow min_room
min_accept CHARTABLE database_poltime CLOSED_MESSAGE mdl_buffers
allow_dcl_access

MM_userid


  This entry includes the userid of Monster Manager. The userid must 
  be written in lowercase. The MM, who should also be the game
  administrator, has the most power. 

Example

MM_userid: leino

gen_debug

  Tells whether everyone may use the debug command. You must be able
  to disable it because it gives away players too much information on
  monsters. On the other hand,you also must be able to enable it
  if we want to do test runs under an unprivileged userid.

Example

gen_debug:   false

REBUILD_OK

  If true, the Monster Manager can blow away ( exterminate, demolish ) 
  and reformat the entire universe. It is preferable to set this to false.
  It must be true when the MM wants to use the /REBUILD option.

Example

REBUILD_OK: false

root

  The home of the Monster database. The root directory protection must 
  be set to world:e and the datafiles Monster creates in it must be
  set to world:rw for people to be able to play.

Example

root:    games_disk:<monster.database.db>		 

coderoot

  The codefiles for monsters are situated in the coderoot directory. 
  The directory must additionally have an ACL default world:rw  for  
  files and ACL rw for the managers.

Example

coderoot:games_disk:<monster.database.c>   

LEVELTABLE

  The leveltable tells the levels of Monster. Certain privileges are
  associated with levels. The highest level is Monster Manager ( not 
  shown in the leveltable ).

Privileges

  Value    Name       Meaning 
  32       Monster    Can create monsters that can modify players' context.
  16       Special    Can make special items
  256      Spell      Can create spells that can modify players' context.
  4        Global     Can modify global descriptions and flags.
  8        Owner      Can customize other players' item like the owner.
  64       Experience Can write MDL code that changes player scores.
  1        Manager    Can execute the SYSTEM command.

Example

LEVELTABLE:
!  name		    exp	         priv	 health	   h.fac    pow    hidden 
Beginner,           0,           0,      10,       40,      0,     nohidden
Novice,             1,           0,      10,       40,      2,     nohidden
Ranger,             500,         0,      15,       50,      3,     nohidden
Adventurer,         1000,        0,      20,       60,      5,     nohidden
Hero,               2000,        32,     30,       60,      10,    nohidden
Champion,           6000,        0,      40,       70,      10,    nohidden
Conjurer,           12000,       16,     50,       70,      12,    nohidden
Magician,           20000,       0,      60,       70,      15,    nohidden
Enchanter,          40000,       2,      80,       75,      20,    nohidden
Sorcerer,           70000,       256,      100,      80,      20,    nohidden
Warlock,            120000,      4,      120,      85,      35,    nohidden
Apprentice wizard,  300000,      8,      150,      85,      50,    nohidden
Wizard,             700000,      64,     300,      90,      80,    nohidden
Almost Dead,        1000100,     0,      10,       40,      2,     hidden
Manager,            2000000,     1,      500,      100,     500,   hidden
Druid,              2001000,     0,      500,      100,     500,   hidden
Charlatan,          2008000,     0,      500,      100,     500,   hidden
Wanderer,           2009000,     0,      500,      100,     500,   hidden
Chief Architect,    3000000,     0,      500,      100,     500,   hidden
Bug Hunter,         5000000,     0,      500,      100,     500,   hidden
END OF LEVELTABLE

Archpriv

  The experience entry for the Monster Manager. The level of the MM 
  is not in the leveltable.

Example

Archpriv:   0

Archhealth

  The health entry for the Monster Manager.

Example

Archhealth: 800

Archfactor

  The hit factor for the Monster Manager.

Example

Archfactor: 100

Archpower

  The power entry for the Monster Manager.

Example

Archpower:  1000

maxexperience

  The maximum experience that players can reach.  Notice that the 
  experience of the Monster Manager is MAXINT.

Example

maxexperience: 1000000

protect_exp

  When players reach this experience level they become immortal.

Example

protect_exp: 700000

Playtime

  Shows time when Monster is playable during workdays. The '+' mark 
  means that Monster is playable and the '-' mark means that it is 
  not. The marks denote time from 00-01 until 23-24 ( 11pm-12pm ).

Example

Playtime: +++++++++--------+++++++

default_allow

  How many rooms players are allowed to make by default.

Example

default_allow: 20

min_room

  How many rooms players are allowed to make without an exit request.

Example

min_room:      5

min_accept

  How many accepts must players make.

Example

min_accept:    5

CHARTABLE

  Monster's default character set is (Dec) Multinational character set.
  This modify that table.

  Lines in this table have forms:
     char <quoted character> <character type> <case modifier>
     char <character number> <character type> <case modifier>

  There can also be one line with form:
     charset <charset name>

Additional information available:

quoted_character character_number type case_modifier charset_name
Example

quoted_character

  Quoted character is enclosed to quote characters (").

  This argument tells what character is modified.

character_number

  Number is decimal number of character (0-255).

  This argument tells what character is modified.

type

  Character types have: none, letter, special and space.

     none:     This is for non-printable characters (Monster usually
                 skips these characters)
     letter:   This is letter
     special:  This is character what possible some special meaning
                 in monster (for example numbers).
     space:    This character is treated as space

case_modifier

  Case modifier have forms:
     upper <character number>
     upper <quoted character>
     lower <character number>
     lower <quoted character>

  This modifier tells correspond upper or lower case letter for
  that character what is modified.

charset_name

  This tells name of caharacter set, which is described in that chartable.

  Charset name can be on word. If it have more than one word, it must
  close to quotaion marks(").
  

Example


  CHARTABLE:
  charset ISO646-FI
  char "{" letter upper "["
  char "|" letter upper "\"
  char "}" letter upeer "]"
  char "]" letter lower "}"
  char "\" letter lower "|"
  char "[" letter lower "}"
  END OF CHARTABLE

database_poltime

  How often database is polled for interprocess communication.

  This value is VMS Delta-time format.

Example

  database_poltime: 0 ::1

  This is 1 second (0 days, 0 hours, 0 minutes and 1 second).

CLOSED_MESSAGE

   This message is printed, when Playtime: -entry disallows playing.

Example

  CLOSED MESSAGE:
  Welcome to the game Monster!

  But what now?

  Goodgulf the Grey appears in a puff of orange smoke!
  He is very angry...

  "What are you doing here? The Dungeon is now closed!"

  He waves his Iron Staff and yells "Begone!"

  You disappear in a burst of multicolored light...

  On wall you see announcement:

  **********************************************************************
  *                                                                    *
  *                    Dungeon is closed on weekdays                   *
  *                         between 09.00-17.00                        *
  *                                                                    *
  **********************************************************************

  END OF MESSAGE

mdl_buffers

  How many MDL code is kept in memory.

Example

  mdl_buffers: 20

allow_dcl_access

  If this is true, then command 'dcl' is available.

Installation

  In order to install Monster your must create several directories, 
  compile it, copy files to right directories,  edit configuration 
  files and build a database for it.

Additional information available:

Directories Compilation Editing Protection Database
Publishing Questions

Directories

  Create four directories:
    Directory for sources, from now on it is called the SOURCES directory.
    Directory for MONSTER.EXE, MONSTER_DUMP.EXE, MONSTER_REBUILD.EXE and 
      MONSTER_WHO.EXE, from now on it is called the IMAGE directory.
    Directory for *.MON files, from now on it is called the 
      DATABASE_MON directory.
    Directory for CODE*.MON files, from now on it is called the 
      DATABASE_CODE directory.

Additional information available:

SOURCES IMAGE DATABASE_MON DATABASE_CODE

SOURCES

  Files: CLI.PAS, CONVERT.BATCH, CUSTOM.PAS, DATABASE.PAS,  FIX.BATCH, 
  GLOBAL.PAS, GUTS.PAS, INTERPRETER.PAS, KEYS.PAS, MAKEFILE.  MON.PAS,
  MONSTER_WHO.PAS, PARSER.PAS, PRIVUSERS.PAS, QUEUE.PAS, MONSTER_E.HLP,
  MONSTER_DUMP.PAS, MONSTER_REBUILD.PAS, ALLOC.PAS and VERSION.PAS.

IMAGE

  Files: MONSTER.CLD, MONSTER.INIT.

  Compiled files: MON.EXE, MONSTER_WHO.EXE, MONSTER_E.HLB, 
  MONSTER_DUMP.EXE and MONSTER_REBUILD.EXE.

DATABASE_MON

  Files: COMMANDS.PAPER, MONSTER.HELP.

  Files created by /REBUILD: DESC.MON, EVENTS.MON, HEADER.MON, 
  INDEX.MON, INTFILE.MON, LINE.MON, NAMS.MON, OBJECTS.MON, 
  ROOMS.MON, SPELLS.MON.

DATABASE_CODE

  Files created by /REBUILD: CODE1.MON, CODE2.MON, CODE3.MON, CODE4.MON,
  CODE5.MON.

  Command H (Add header blocks) in the System menu adds a number of 
  files in this directory!

Compilation

  First: Edit KEYS.PAS (change gryp-keys !!)

  Commands for compilation:
$ LIBRARIAN/CREATE/HELP MONSTER_E MONSTER_E
$ PASCAL /CHECK=ALL GLOBAL                
$ PASCAL /CHECK=ALL GUTS                 
$ PASCAL /CHECK=ALL DATABASE              
$ PASCAL /CHECK=ALL CLI
$ PASCAL /CHECK=ALL  PRIVUSERS
$ PASCAL /CHECK=ALL PARSER                
$ PASCAL /CHECK=ALL INTERPRETER          
$ PASCAL /CHECK=ALL QUEUE                 
$ PASCAL /CHECK=ALL ALLOC        
$ PASCAL /CHECK=ALL CUSTOM               
$ PASCAL /CHECK=ALL MON                   
$ PASCAL /CHECK=ALL  KEYS         
$ PASCAL /CHECK=ALL VERSION              
$ LINK MON,GUTS,INTERPRETER,KEYS,PRIVUSERS,QUEUE,PARSER,CLI,GLOBAL, -
DATABASE,CUSTOM,ALLOC,VERSION  
$ PASCAL /CHECK=ALL MONSTER_DUMP
$ LINK MONSTER_DUMP, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER,   VERSION
$ PASCAL /CHECK=ALL MONSTER_REBUILD
$ LINK MONSTER_REBUILD, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER, -
ALLOC, KEYS, VERSION
$ PASCAL /CHECK=ALL MONSTER_WHO
$ LINK MONSTER_WHO, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER

  You can also produce these files with command
$ MMS ALL
  if you have MMS (and MAKEFILE in that directory)

  Copy MON.EXE, MONSTER_WHO.EXE, MONSTER_DUMP.EXE, MONSTER_REBUILD.EXE 
  and MONSTER_E.HLB to the "IMAGE" directory.

Editing


  Edit the following files: KEYS.PAS, MONSTER.CLD, MONSTER.INIT.
  Edit KEYS.PAS before compiling Monster !

Additional information available:

KEYS.PAS MONSTER.CLD MONSTER.INIT ILMOITUS.TXT

KEYS.PAS


  Edit the keys array. You can change the number of lines of keys array 
  but you cannot change the length of lines of keys -array. Assign the 
  number of lines to the "maxkeys" constant.

MONSTER.CLD

   Insert the full specification of the IMAGE directory to the following 
   places:

define syntax MONSTER_WHO
   image <IMAGE -directory>monster_who
   noqualifiers
define syntax MONSTER_DUMP
   image <IMAGE -directory>monster_dump
   parameter P1
        label = DUMP_FILE
        prompt = "Dump file"
        value(type=$file,required)
define syntax MONSTER_REBUILD
  image <IMAGE -directory>monster_rebuild
define verb MONSTER
   image <IMAGE -directory>mon
   qualifier WHO
      nonnegatable
      syntax = MONSTER_WHO

MONSTER.INIT

  Edit places marked with the "<>" marks:

MM_userid: <your userid in lowcase>

gen_debug:   false

REBUILD_OK: <set this to true before /REBUILD, afterwards to false>

root:     <full specification of the DATABASE_MON directory>
coderoot: <full specification of the DATABASE_CODE direcory>
       
LEVELTABLE:
* Leveltable removed: see examples from the "initialization_file" part of 
  this help *
END OF LEVELTABLE
Archpriv:   0
Archhealth: 800
Archfactor: 100
Archpower:  1000

maxexperience: 1000000

protect_exp: 700000

Playtime: <insert the right time into this: look examples from the 
           "initialization_file" part of this help>

default_allow: 20    
min_room:      5     
min_accept:    5    

CHARTABLE:
END OF CHARTABLE

database_poltime: 0 ::1

CLOSED MESSAGE:
Monster is now closed !!
END OF MESSAGE

mdl_buffers: 20

ILMOITUS.TXT


  This file is no longer needed.
  Use instead 'CLOSED MESSAGE' -entry in MONSTER.INIT.

Protection

  Insert the following ACls into the DATABASE_MON and the 
  DATABASE_CODE directories 
  (to *.DIR file).
          (IDENTIFIER=<your name>,
             ACCESS=READ+WRITE+EXECUTE+DELETE+CONTROL)
          (IDENTIFIER=<your name>,OPTIONS=DEFAULT,
             ACCESS=READ+WRITE+EXECUTE+DELETE+CONTROL)
          (DEFAULT_PROTECTION,SYSTEM:RWED,OWNER:RWED,GROUP,WORLD:RW)

  Insert similar ACLs for all other managers (of monster) into the 
  DATABASE_CODE directory.

  Put protection (world:execute) or (world:read+execute) to 
                IMAGE, DATABASE_MON and DATABASE_CODE directory

  Put protection (world:read) to 
        ILMOITUS.TXT, MONSTER.CLD, MONSTER.INIT, MONSTER_E.HLB,
        and MONSTER.HELP files.
        
  Put protection (world:execute) to 
        MON.EXE and MONSTER_WHO.EXE files 

  MONSTER_DUMP.EXE and MONSTER_REBUILD.EXE do not need to be 
  executable by the world.

  After building the database put protection (world:read+write) to
        *.MON files
  in DATABASE_MON and DATABASE_CODE directories.

Database

  Define the monster command by:
      SET COMMAND MONSTER (in IMAGE directory)

  Build the monster universe with the MONSTER/REBUILD command.

  or

  copy your old ( Rich Skrenta's ) monster database to the 
  DATABASE_MON directory and try: MONSTER/BATCH=CONVERT (No warranty!)

  or

  MONSTER/BUILD CASTLE.DMP
  ( CASTLE.DMP contains the distributed starter's castle )

  Change protection (world:read+write) to
        *.MON files
  in the DATABASE_MON and the DATABASE_CODE directories.

Publishing

  Tells anybody that he can play Monster
     after command
     SET COMMAND Your_Disk:<Your IMAGE directory>MONSTER
  with MONSTER command

Questions

  Questions to Kristallipallo@com.cc.Helsinki.FI
               Kari.Hurtta@Helsinki.FI        hurtta@cc.Helsinki.FI
               HURTTA@FINUH.BITNET
               Antti.Leino@Helsinki.FI        leino@cc.Helsinki.FI
               LEINO@FINUH.BITNET
               Juha.Laiho@Helsinki.FI         jlaiho@cc.Helsinki.FI
               JLAIHO@FINUH.BITNET

Original

  This text is from the release of the original Monster by Rich Skrenta. 

Additional information available:

Files Game Technical_Aspects Appendixs

Files

  Monster was written in VMS Pascal under VMS 4.6.  It uses file 
  sharing and record locking for communication.  Outside of that, 
  it doesn't do anything tricky.  However, after playing around with 
  a VMS 4.2 system, I have doubts if it will work on a system that 
  old.  If you've got a reasonably recent version of VMS and a Pascal 
  compiler, you shouldn't have any problems.
 
  The Monster source is in two files:  a short one, approx 300 lines, 
  called guts.pas, and a big one, mon.pas, approx 13,000 lines.  The 
  compiled program contains everything necessary to create and 
  maintain  the Monster universe. There is no separate maintenance 
  program.  Instead,  specific people in the game have priviledges, 
  and are known as the  "Monster Managers".  The MMs can do system 
  maintenance while playing, and  other players can even observe their 
  work.
 
  After reading the document, if you would still like to obtain Monster,
  send me a letter reaffirming your interest.  Thanks!
 

Game

 
  Monster is a text-oriented computer adventure game.  Like other 
  traditional adventure games such as Zork and Adventure, Monster 
  players issue simple commands to direct a "puppet" through an 
  artificial world.  Players can explore the world, pick up and 
  make use of objects, and solve puzzles.
 
  However, Monster is quite different from other computer adventures 
  in two respects:  first, Monster is a multiplayer game.  In addition 
  to the normal actions a player can effect on the simulated environment, 
  players can also interact with one another.  Player characters can 
  fight, talk, trade items and explore territory together.  Monster 
  is similar in this respect to some multiplayer games available on 
  computer networks such as the Source and Compuserve.
 
  However, Monster allows players to do something that very few, if any, 
  other games allow:  the players themselves create the fantasy world as 
  part of the game.  Players can create objects, make locations, and set 
  up puzzles for other players to solve.  Game mechanisms allow players to:
 
        o Create and describe new objects and locations
        o Specify how game objects function
        o Provide text descriptions for events that may happen
 
  For example, a player in Monster could create a room named "Great 
  Hall", provide a textual description for it (which other players 
  would see upon entering the rooms), and describe special features 
  of the room (for instance, a brass plaque on the wall).
 
  Here's what another player who walked into the room described above 
  would see (lines beginning with > are the player's input):
 
  > look
  You're in Great Hall
  You're in the middle of a vast hall stretching out of sight to the
  east and west.  Strange shadows play across the high vaulted ceiling.
  The floor is set with smooth rectangular stones.  The walls feel slightly
  cold to the touch, and damp with condensation.  A copper plaque, slightly
  green with age, is set into one wall.
 
  > look plaque
 
  The plaque looks very old and corroded.   However, you can still make out
  the writing:
 
  " Monster, created by Rich Skrenta, 1988.  Play at your own risk. "
 
  Now the creator of the rooms could add a secret passage, perhaps 
  hidden underneath some stones in the floor.  To do this, first the 
  player would describe what the stones looked like, then make a hidden 
  exit to another location with a special command which would activate 
  it.  Here's what the player would see after making these changes:
 
  > show details
  Details here that you may inspect:
      stones
      plaque
  > look stones
  The stones are rough and black, and cold to the touch.  Although the
  mortar work appears to have been expertly done, it has decayed with time.
  Many stones are cracked, and narrow spaces fracture the carefully laid
  pattern.  Some of the stones are quite loose.  You might be able to lift
  one of them with some effort.
  > lift
  With great effort, you manage to lift the stone enough to fit inside.
 
  Once below the stone, it falls back into place, sealing out the light
  from above.  You squirm down the narrow tunnel . . .
 
  This example only hints at the details that actually go into the 
  creation of a realistic game puzzle.  To set up a rich game location, 
  a player would have to
  specify:
 
        o A textual description of the room, as well as separate descriptions
          for various rooms details (in the example above, the plaque and
          the stones are room details)
        o A description of each of the possible exits from the rooms (there
          might be no description if the exit is hidden)
        o What happens when an object is dropped at the location (for example,
          if a player is swimming and he drops something, the object should
          sink) as well as a message describing what happened to the object
        o For each exit, a set of messages and parameters including:
                - the name of the exit
                - whether the exit requires a special object to pass (for
                  example, a door key or some magic object)
                - a message displayed to the player if he can't successfully
                  leave through the exit (if he doesn't have the key, for
                  instance)
                - an optional message that the player sees when he goes
                  through an exit (in the example above, the text "Once below
                  the stone, it falls back into place...." is such a message)
                - a message that players inside the room see when someone
                  leaves through the exit
                - a message that players inside the room see when another
                  player enters the room through the exit
		- special features specific to this exit
                - miscellaneous other parameters
 
 
 

Technical_Aspects

 
  Each player who plays the Monster game runs a separate copy of the 
  game.  Each individual Monster process shares a database containing 
  all of the information about the simulated world, including:
 
        o Records describing all of the rooms, interconnections between 
          rooms, objects, and descriptions for the above
        o The locations of every player and object
        o A special shared file used for interprocess communication
 
  Each of the Monster database files are organized as a linear collection
  of fixed-length records.  Monster uses the following files:
 
        roomfile:       file of records containing data on Monster locations
        namfile:        file containing names for objects, rooms and people
        descfile:       file of text description blocks (10 lines maximum)
        linefile:       file of short (one line) descriptions
        intfile:        file of various integer parameters
        objfile:        file of records containing data on Monster objects
        indexfile:      file of bitmaps for the other files; used to mark
                        free/inuse records for dynamic allocation
        eventfile:      file of records used for interprocess communication
	spellfile:      contains player's spell information
 
 

Additional information available:

Record_Locking Interprocess_Communication Maintaining_a_Player's_Existence_in_the_Database Reflections_on_the_Project

Record_Locking

 
  When Monster tries to access a record in one of the shared data 
  files, it first makes a read attempt on the record.  If the record 
  is available (no other Monster process is reading or writing it) VMS 
  will lock and read the record and return successfully.  If another 
  process has locked the record, VMS will return an error condition.  
  In this case the Monster process will wait a small random amount of 
  time and attempt to read the record again.  Then if the Monster program 
  cannot successfully read and lock the record after a certain number of
  retries, it prints an error message and aborts.
 
  In initial versions of Monster a count was kept of how many times 
  two processes would "collide" when both wanted to read one record.  
  The random wait dramatically reduced this hit count.
 
  Monster's response time using this scheme is acceptable when the 
  load on the VAX is not too high.  However, it does have some 
  drawbacks.  The first is that a data record being read by a Monster 
  process is locked for a short time, even if the process has no 
  intention of writing to it.  Also, the collide-and-wait approach is 
  somewhat crude considering VMS has extensive record locking facilities 
  which are capable not only of allowing multiple-read access to a 
  record but also of queueing processes desiring to write-lock a record.
  Unfortunately, the use of these facilities requires special VMS 
  priviliges not available to ordinary users.  During testing on a 
  VAX 8800 running VMS 5.1 with over 50 interactive users and 14 
  players response time was fast enough for most picky users.
 
 

Interprocess_Communication

 
  Monster processes communicate through a shared file.  A communication 
  from one process to another is referred to as an event; the shared 
  file for communication is called the event file.  Two player processes 
  will only need to communicate if both players are in the same location, 
  since actions in one room won't affect gamers elsewhere.  However, 
  when two or more players are in the same location, quite a lot of events 
  may happen:
 
        o Notification of entry and exit -- players in the room must see when
          other players come and go
        o Notification of various actions -- such as picking up and dropping
          objects, taking inventory and closely examining things
        o Messages when players talk to each other in the game
        o Primary, target and third-party events for fighting -- the player
          throwing the punch sees one thing, the person being hit another,
          and somone else watching sees a third message.
 
  Because only player processes in the same Monster game location 
  need to communicate, each room has an associated event file record.  
  Each event file record contains a circular list of events with a 
  pointer to the most recent event.  When a player enters a new room, 
  either by moving or joining the game, the Monster process reads the 
  event file record for the room and makes a local copy of the current 
  event pointer.  At periodic intervals, the Monster process will reread 
  the event file record and compare its local pointer to the one in the 
  event file.  If they are different, other player processes have logged
  events to the event record, and the Monster process will pull them 
  off the list, handle them, and update its own local pointer.  When 
  a process needs to log an event, it write-locks the event file record, 
  writes a new event, and updates the event file pointer.
 
  There are over sixty different events that a Monster process can 
  initiate or handle; each event can be interpreted differently 
  according to circumstances. For example, player A may whisper 
  something to player B.  Suppose player C is also in the room.  
  Player A's process logs an event containing the message, the event 
  type ("whisper") and the target of the whisper (player B) to the
  event file record associated with their current location.
 
  > whisper b
  >> Hey b, this is something I whispered to you.
 
  Player B's process will receive and handle the event:
 
  A whispers, "Hey b, this is something I whispered to you."
 
  Player C's process will also receive and handle the event.  
  Usually C will only see A and B whispering together:
 
  A is whispering to B.
 
  However, there is a small chance that C will overhear the message:
 
  You overhear A whispering to B:
    "Hey b, this is something I whispered to you."
 
  This method of interprocess communication requires that all 
  Monster processes frequently read the event file to see if any 
  events have occured.  This might seem less efficient than another 
  scheme possibly using VMS mailboxes or shared memory.  Lack of 
  sufficient VMS privileges prevented me from using shared memory.  
  Mailboxes might be more efficient, especially if used with the Vax's
  interrupt system.  However, several problems would be present:
 
        o In order to allow any process to communicate with any other,
          full interconnection would be necessary.  In addition, since VMS
          mailboxes only transmit data in one direction, n Monster processes
          would require 2n mailboxes.  A scheme using mailboxes would quickly
          exhaust process quota limits.
 
        o It is somewhat awkward to set up mailboxes and even more difficult
          to inform other processes of their presence.  Once again, I believe
          that special VMS privileges might be necessary to do this.
 
  The event file scheme of communication has proven flexible and is 
  fast enough when the VAX load is not high.
 
 

Maintaining_a_Player's_Existence_in_the_Database

 
  When a user runs Monster, it first checks a playerlog to see if 
  he has ever played before.  If so, the player is restored to the 
  state he was in when he last played, just before issuing the QUIT 
  command.  In the user is not found in the playerlog, he is started 
  out at an initial location, somewhat in the center of the world.
 
  To place a player into a location, Monster scans the room record 
  for a free "person" slot to put the player's index into.  Once the 
  player is part of the room record, he will be visible to other 
  players who are also in that room (providing he hasn't hidden 
  himself), and they will be able to interact with him.
 
  A dangerous situation occurs when a player process dies or becomes 
  disconnected for some reason.  In this case, the room record shows 
  that a certain player is in a location, but in fact there is no 
  controlling Monster process for that player.  There will be no 
  process to handle events directed at that player. This is a bad 
  situation because they player is not obviously "dead" to the
  other Monster programs, as interprocess communication only involves 
  sending an event, and does not provide for receipt acknowledgement.
 
  These "zombie" players were a serious nuisance in an early version 
  of Monster. The Monster world appeared to be full of players, when 
  in fact they were just ghosts left from players typing the VAX 
  interrupt character or becoming disconnected from modems (Monster 
  now inhibits the interrupt character to help prevent the casual 
  creation of zombies).
 
  There are two cases where a zombie game character may be detected:  
  when another player suspects that a game character is not being 
  controlled by a real user (either from a lack of response from the 
  game character or by checking the VAX user list); or when the player 
  who created the zombie character attempts to play Monster again (only 
  one player per account is allow to play Monster at a time, so if a 
  player tries to enter Monster and also appears to be currently playing 
  the game, either 1) two players on one account are trying
  to play Monster at the same time, or 2) the player character that 
  appears to be currently playing Monster is really a zombie).
 
  To handle the first case, when one player suspects another of being 
  a zombie, the player can issue the PING command.  PING sends repeated 
  events directed at the suspected zombie, with short pauses between the 
  sends.  If PING does not receive a response within a certain amount of 
  time (currently about three seconds) it attempts to smoothly return the 
  zombie character to the "inactive" (not playing) state.  This involves 
  taking every object the player character was holding and dropping them 
  on the ground, updating the "time of last play" record and modifying 
  the playerlog to show that the player is not currently playing.
 
  In the second case, when no other player has PINGed away the zombie 
  and the original player (the one responsible for the zombie character) 
  attempts to reenter Monster, Monster will inform him:
 
        There may have been some trouble the last time you played.
        Trying to fix it . . .
 
  At this point, Monster itself attempts to PING the player's character.  
  If two people on the same account are trying to play Monster at the 
  same time the PING will be answered and Monster will not let the 
  second player into the game.  Otherwise, the player will enter Monster 
  normally after a short pause:
 
        All should be fixed now.
 
        Welcome back, Faust.  Your last play was on 13-MAY-1988 at 8:31pm.
 
  Even with this solution, there are still situations where trouble can 
  arise with zombie characters.  For example, suppose a player is on a 
  modem playing Monster and becomes disconnected.  Another player PINGs 
  away the zombie character.  The dialup player calls up the VAX again, 
  and reconnects to his disconnected process.  Now his Monster process 
  still thinks the player character is alive in the room (it has no 
  knowledge of the disconnect) but the database shows that the player 
  is inactive.
 
  If only a few events have been logged in the associated event file 
  record, the reconnnected Monster process will notice the fatal PING 
  to itself (lingering in the event file record) and will abort.  
  However, if many events have occured while the process was disconnected, 
  it will not be aware of the change to the database. This will leave the 
  database in an inconsistent state until the player QUITs the game.  
  Fortunately, when the player quits the database will be fixed.
 
  Since this problem will eventually correct itself (when the player 
  quits) and because checking for this very rare situation would slow 
  response time considerably (Monster would have to verify its existence 
  in the database continuously) I decided to ignore this exception.
 
  I had originally hoped for a smoother solution to the "disconnected 
  player" problem.  In a system where a central process drives all of 
  the player terminals, this is possible.  However, because control in 
  Monster is shared between many identical processes, the problem is 
  much harder.
 
 

Reflections_on_the_Project


  How the "Installed Base" Stagnated New Development:
  
 
  During the development of Monster I would periodically change the
  records that held the Monster database.  Once changed in the program, 
  this would render the existing database unusable, as the new program 
  could no longer open the old files.  Thus, I would have to destroy 
  the existing world if I wanted to add any fields to the records that 
  comprised the shared files.
 
  In order to provide a stable environment for players who did not want 
  to see their hard work making Monster rooms destroyed every time I made 
  a change to the structure of the database, I installed a version with 
  a separate set of data files than the copy I worked on for development.  
  Players created rooms and tested the installed version, while I continued 
  to develop my own copy. Eventually, the world in the first release of 
  Monster had about 60 rooms.
 
  About a month after installing the original Monster I replaced it 
  with the new, greatly enhanced version I had been working on (the 
  executable was about 4 times the size of the original) and started 
  over with an empty world.  I had provided expansion fields in the 
  data records for the new release of Monster so I could continue to 
  develop the game without having to work on my own private copy.
 
  The second release of Monster was very popular.  I continued to add 
  features to the program, and made use of the expansion fields when 
  possible.  However, I felt more and more constrained by the limits of 
  my database.  I needed to change more about the data records than the 
  expansion fields would allow. I wanted to erase the world a second time; 
  however, players had put much work into creating over 100 rooms, and 
  became quite angry when I suggested that I might throw away the current 
  world to make a new one.
 
  Some suggested that I write a program which would convert the existing 
  database to a new format.  However, I felt that the work to do this 
  would be much greater than the work I was planning to spend to make 
  enhancements to the game. Also, the style of my changes during development 
  called for small frequent changes. I abandoned the idea of trying to 
  write a translation program, and instead attempted to work around the 
  limitations of the database structure.  Eventually, however, my work 
  stagnated, and new development on Monster ceased.
 
  I never anticipated the work of my playtesters holding back further 
  development. If I were to rewrite Monster, I would use a more flexible 
  storage approach, one probably involving a form of dynamic typing which 
  would let me add new parameters to the database without actually 
  changing the record structure or size.
 

Appendixs


Additional information available:

A B C D E

A

Appendix A:  Specifyable Parameters for Monster Locations and Objects
 
  Rooms:
  ------
   
  nicename:       the name of the room
  nameprint:      formatting control for the nicename
  primary,
  secondary:      textual descriptions of the room
  which:          control for which room description prints:
                          0 - only print primary room description
                          1 - only print secondary room description
                          2 - print both primary and secondary room descriptions
                          3 - print primary description; then print secondary
                              description if the player is holding the specified
                              magic object for the room
  magicobj:       the magic object for the room
  trapto,
  trapchance:     allows a player to semi-randomly be thrust through an exit
  rndmsg:         eerie message that randomly prints
  details:        details that may be looked at in the room
   
   
  Exits:
  ------
   
  toloc:          where the exit goes
  kind:           type of the exit:
                          0 - no exit; always fails
                          1 - open exit; always succeeds
                          2 - exits succeeds if player has key object
                          3 - exit fails if player has key object
                          4 - exit randomly fails
                          5 - potential exit; doesn't exist yet
                          7 - exit cycles between being open and closed
  exitdesc:       short textual descrption of the exit
  fail:           description if player fails to go through exit
  success:        description if player succeeds to go through exit
  goin:           what other players see when someone goes into the exit
  comeout:        what others see when a player comes out of the exit
  hidden:         what the player sees when he finds the exit (if it's hidden)
  objreq:         key object for exit
  alias:          name of the exit
  reqverb:        requires the player to use the alias only (without "go") to
                  use the exit
  reqalias:       requires the player to know the exit alias; can't use the
                  compass point
  autolook:       surpresses the automatic "look" done upon entering the
                  new room
   
  Objects:
  --------
   
  oname:          the name of the object
  kind:           type parameter for the object
  linedesc:       short description of the object (the "on the floor" description)
  examine:        close inspection description for the object
  numexist:       how many copies of the object exist
  sticky:         inhibits players from being able to pick up the object
  getobjreq:      requires the player to be holding another object before
                  he can pick up this one
  getfail:        message printed if a player fails to get an object
  getsuccess:     message printed when an object is successfully picked up
  useobjreq:      object player must be holding to use this object
  uselocreq:      place player must be in to use this object
  usefail:        message printed if player fails in use of the object
  usesuccess:     message printed if object is successfully used
  usealias:       alias word to "use"
  reqalias:       require player to know the alias to use the object
  article:        whether "a", "an", "some", "the" should precede the object name
   
 

B

Appendix B:  Monster Command List
 
  Accept/Refuse #  Allow others to Link an exit here at direction # | Undo Accept
  Brief            Toggle printing of room descriptions
  Customize [#]    Customize this room | Customize exit # | Customize object #
  Describe [#]     Describe this room | Describe a feature (#) in detail
  Destroy #        Destroy an instance of object # (you must be holding it)
  Duplicate #      Make a duplicate of an already-created object.
  Form/Zap #       Form a new room with name # | Destroy room named #
  Get/Drop #       Get/Drop an object
  #,Go #           Go towards # (Some: N/North S/South E/East W/West U/Up D/Down)
  Health           Show how healthy you are
  Hide/Reveal [#]  Hide/Reveal yoursef | Hide object (#)
  I,Inventory      See what you or someone else is carrying
  Link/Unlink #    Link/Unlink this room to/from another via exit at direction #
  Look,L [#]       Look here | Look at something or someone (#) closely
  Make #           Make a new object named #
  Name #           Set your game name to #
  Players          List people who have played Monster
  Punch #          Punch person #
  Quit             Leave the game
  Relink           Move an exit
  Rooms            Show information about rooms you have made
  Say, ' (quote)   Say line of text following command to others in the room
  Search           Look around the room for anything hidden
  Self #           Edit a description of yourself | View #'s self-description
  Show #           Show option # (type SHOW ? for a list)
  Unmake #         Remove the form definition of object #
  Use #            Use object #
  Wear #           Wear the object #
  Wield #          Wield the weapon #;  you must be holding it first
  Whisper #        Whisper something (prompted for) to person #
  Who              List of people playing Monster now
  Whois #          What is a player's username
  ?,Help           This list
  . (period)       Repeat last command
 

C

Appendix C:  Customization Subsystem Menus
 
  Room Customization:
  -------------------
   
  Custom> ?
   
  D       Alter the way the room description prints
  N       Change how the room Name prints
  P       Edit the Primary room description [the default one] (same as desc)
  S       Edit the Secondary room description
  X       Define a mystery message
   
  G       Set the location that a dropped object really Goes to
  O       Edit the object drop description (for drop effects)
  B       Edit the target room (G) "bounced in" description
   
  T       Set the direction that the Trapdoor goes to
  C       Set the Chance of the trapdoor functioning
   
  M       Define the magic object for this room
  R       Rename the room
   
  V       View settings on this room
  E       Exit (same as quit)
  Q       Quit (same as exit)
  ?       This list
   
   
  Exit customization:
  -------------------
   
  Custom [direction]> ?
   
  A       Set an Alias for the exit
  C       Conceal an exit
  D       Edit the exit's main Description
  E       EXIT custom (saves changes)
  F       Edit the exit's failure line
  I       Edit the line that others see when a player goes Into an exit
  K       Set the object that is the Key to this exit
  L       Automatically look [default] / don't look on exit
  O       Edit the line that people see when a player comes Out of an exit
  Q       QUIT Custom (saves changes)
  R       Require/don't require alias for exit; ignore direction
  S       Edit the success line
  T       Alter Type of exit (passage, door, etc)
  V       View exit information
  X       Require/don't require exit name to be a verb
  ?       This list
   
   
  Object Customization:
  ---------------------
   
  Custom object> ?
   
  A       "a", "an", "some", etc.
  D       Edit a Description of the object
  F       Edit the GET failure message
  G       Set the object required to pick up this object
  1       Set the get success message
  K       Set the Kind of object this is
  L       Edit the label description ("There is a ... here.")
  P       Program the object based on the kind it is
  R       Rename the object
  S       Toggle the sticky bit
   
  U       Set the object required for use
  2       Set the place required for use
  3       Edit the use failure description
  4       Edit the use success description
  V       View attributes of this object
   
  X       Edit the extra description
  5       Edit extra desc #2
  E       Exit (same as Quit)
  Q       Quit (same as Exit)
  ?       This list
   

D

Appendix D:  Monster Playerlist as of June 5, 1988
 
  dolpher       ! Monster Manager        5-JUN-1988  1:48pm * great baths
  dasun_c       ! Iceman                 4-JUN-1988 10:30pm * the transporter room
  kirsten       ! Kirsten                4-JUN-1988 11:20pm * ffoirefirma
  isakson       ! Satan                  3-JUN-1988 10:13am * satan's private hell
  tlb05405      ! Tlb05405               3-JUN-1988 11:59am * east hall
  nate          ! Smaug                  3-JUN-1988  7:41pm * platform 1
  skrenta       ! Faust                  3-JUN-1988  8:37pm * tower room
  gary          ! Monster Vice Manager   2-JUN-1988  9:50pm * inner office
  laura         ! Laura                  2-JUN-1988 10:36pm * turbolift chamber
  james         ! James                  1-JUN-1988  7:54pm * chuk's elevator
  chuk          ! SoulStorm              1-JUN-1988  9:57pm * east hall
  peter_t       ! Peter_t               31-MAY-1988  8:33pm * pine forest
  cary          ! Cary                  31-MAY-1988 11:20pm * maelstrom
  francisco     ! Prof. Anthrax         30-MAY-1988  3:54pm * waterbed
  sundeep       ! Sundeep               29-MAY-1988  2:21pm * mta office
  bkc04916      ! Cheekster             28-MAY-1988 10:51am * the 'ell stop
  ktl04905      ! Corwin                28-MAY-1988 11:44am * west hall
  perry         ! Bufu Master!!!        28-MAY-1988  8:40pm * pinkie's place
  maryahn       ! pinkie                27-MAY-1988 12:39pm * the sewer tunnel
  immell        ! hurricane eye         26-MAY-1988  2:25am * post office 3
  robert        ! Hungry Wolf           26-MAY-1988  2:26am * roll6
  linda         ! linlop                26-MAY-1988 10:47am * terminal room
  jeff          ! Pringle               25-MAY-1988  7:12pm * ic
  mic00229      ! Mic00229              22-MAY-1988  8:33pm * great hall
  jeffoire      ! Ffoire Zen Salad      20-MAY-1988  1:41pm * bar
  schroder      ! Schroder              19-MAY-1988 10:09am * burrow
  lunde         ! Purple Peril          18-MAY-1988 12:55pm * cloud 9.5
  pib           ! Great Pib             17-MAY-1988 11:51pm * great pib's lair
  ahrens        ! it                    15-MAY-1988  4:56pm * landing
  mborsetti     ! Mborsetti             12-MAY-1988 10:20pm * sewer crossroads
  brian         ! Mr. Raven             11-MAY-1988 11:24am * a damp and dark hole
  wen05563      ! Gary                  11-MAY-1988  9:00pm * great hall
  jimbo         ! Jimbo                  8-MAY-1988 10:02pm * great hall
  lentz         ! Lentz                  7-MAY-1988  8:24am * front of isp noyes
  miller        ! Mungus                 5-MAY-1988  1:14pm * starbase
  otto          ! Otto                   4-MAY-1988  8:45pm * heidi's nightmare
  chris         ! House Manager          3-MAY-1988  3:54am * home base
  liao          ! Liao                  30-APR-1988  1:21pm * white house
  chaz          ! Chaz                  29-APR-1988  4:05pm * post office 2
  jmc           ! Run JMC               29-APR-1988  4:37pm * isp heaven
  rod           ! Rod                   29-APR-1988  9:00pm * great hall
  choi          ! Choi                  28-APR-1988  8:25pm * east hall
  bo            ! God                   26-APR-1988  1:58pm * great hall
  jonathan      ! Jonathan              26-APR-1988  5:26pm * eye of the hurricane
  swift         ! Swift                 26-APR-1988  8:53pm * post office hall
  ric05787      ! Deadhead              26-APR-1988 10:57pm * nightmarish room
  mccoy         ! The Scribe            26-APR-1988 11:41pm * scribe home
  g_wenslow     ! Gary II               24-APR-1988 11:58pm * east hall
  kri04333      ! Kri04333              18-APR-1988 12:11am * great hall
  dissett       ! Kronos                18-APR-1988 10:13pm * kronos' room
  wantz         ! Wantz                 17-APR-1988  2:51pm * great hall
  cheezer       ! Cheezer               16-APR-1988  7:55pm * the pine forest
  ahr04465      ! Ivo                   16-APR-1988  7:56pm * sewer transport
  joey          ! geek                  15-APR-1988  8:03pm * forest crossroads
  wargaski      ! Wargaski              14-APR-1988  4:01pm * toxicated
  eric          ! Eric                  13-APR-1988  3:51pm * the hall of chuk
  rwc00220      ! Rwc00220              12-APR-1988  1:32pm * great hall
  kstull        ! Kstull                12-APR-1988  5:01pm * post office 3
  tim           ! Tim                   11-APR-1988  8:26pm * great hall
  sean          ! Sean                  10-APR-1988  4:27pm * great hall
  sam           ! Sam                   10-APR-1988 12:54pm * great hall
  dean          ! Artagel                9-APR-1988  8:21am * turbolift chamber
  supercom      ! Cursor                 8-APR-1988 12:00am * forest paths
  anne          ! Anne                   7-APR-1988  6:55pm * great hall
  lisa          ! Lisa                   7-APR-1988  6:56pm * great hall
  mouse         ! Mouse                  3-APR-1988 11:26pm * west hall
  mca04477      ! Mca04477               2-APR-1988  8:56pm * burrow
  sajiv         ! Sajiv                 30-MAR-1988  6:06pm * great hall
  chad          ! Chad                  30-MAR-1988  6:37pm * chuk's elevator
  jennifer      ! Jennifer              30-MAR-1988  7:22pm * east hall
  lasonia       ! Lasonia               29-MAR-1988 11:22am * west hall
  brian_t       ! Brian_t               29-MAR-1988 11:59am * maelstrom
  mikk          ! Random                29-MAR-1988 11:19pm * ledge
  topher        ! Topher                28-MAR-1988  1:19pm * great hall
  spectre       ! Ghost in the machine  28-MAR-1988 11:43pm * ghost's mailroom
  dave          ! Dave                  18-MAR-1988 10:14am * post office hall
  penguins      ! Penguins Amok         18-MAR-1988 11:52pm * chuk's elevator
  lawson        ! Space Cowboy          18-MAR-1988 12:23pm * great hall
  heidi         ! Heidi                 17-MAR-1988  1:11am * digital purgatory
  bueno         ! Bueno                 17-MAR-1988  7:49pm * post office hall
  dan           ! Grando                16-MAR-1988  8:18am * eye of the hurricane
  eric_yue      ! Samsok                16-MAR-1988  9:29pm * the yueguy's joint
  cra01453      ! Cra01453              15-MAR-1988  3:01am * great hall
  adam          ! Adam                  14-MAR-1988  6:45pm * round room
  was04906      ! Milt                  14-MAR-1988  9:48pm * great hall
  watson        ! Watson                14-MAR-1988 10:22pm * chuk's elevator
  brianw        ! Brianw                12-MAR-1988         * ffoirefirma
  mike          ! Mike                  12-MAR-1988         * toxicated
  predator      ! Predator              12-MAR-1988         * east hall
  daniel        ! Daniel                11-MAR-1988         * west hall
  dav08345      ! Dav08345              11-MAR-1988         * great hall
  vlahos        ! otis                  11-MAR-1988         * post office
  ginter        ! Ginter                10-MAR-1988         * living room
  rob09549      ! Rob09549               9-MAR-1988         * great hall
  dora          ! Dora                   8-MAR-1988         * toxicated
  kim           ! kim                    8-MAR-1988         * post office 2
  michael       ! Prabdib                7-MAR-1988         * tunnel of love
  bradley       ! Bradley               29-FEB-1988         * eye of the hurricane
  john          ! Raunchmeister         29-FEB-1988         * underhall
  melvin        ! Killer Melvin         27-FEB-1988         * chuk's elevator
  cliff         ! Cliff                 26-FEB-1988         * east hall
   

E

Appendix E:  An Actual Monster Game Log
 
  $ monster
  Welcome to Monster!  Hit return to start:
   
  Welcome back, Faust.  Your last play was on 1-JUN-1988 at 10:47pm.
   
  You're in Great Hall
  You're in the middle of a vast hall stretching out of sight to the
  east and west.  Strange shadows play across the high vaulted ceiling.
  The floor is set with smooth rectangular stones.  The walls feel slightly
  cold to the touch, and damp with condensation.  A copper plaque, slightly
  green with age, is set into one wall.
   
  Monster Manager is here.
  >
  Monster Manager vanishes in a brilliant burst of multicolored light.
  > l
  You're in Great Hall
  You're in the middle of a vast hall stretching out of sight to the
  east and west.  Strange shadows play across the high vaulted ceiling.
  The floor is set with smooth rectangular stones.  The walls feel slightly
  cold to the touch, and damp with condensation.  A copper plaque, slightly
  green with age, is set into one wall.
   
  >
  Monster Manager appears in a brilliant burst of multicolored light.
  > who
                     Monster Status
                   1-JUN-1988 10:48pm
   
  Username        Game Name                 Where
  dolpher         Monster Manager           great hall
  skrenta         Faust                     great hall
  > look plaque
   
  The plaque looks very old and corroded.   However, you can still make out
  the writing:
   
   " Monster, created by Rich Skrenta, 1988.  Play at your own risk. "
   
  > show details
  Details here that you may inspect:
      stones
      plaque
  > look stones
  The stones are rough and black, and cold to the touch.  Although the
  mortar work appears to have been expertly done, it has decayed with time.
  Many stones are cracked, and narrow spaces fracture the carefully laid
  pattern.  Some of the stones are quite loose.  You might be able to lift
  one of them with some effort.
  >
  Monster Manager is looking at the stones.
  >
  Monster Manager is looking at the plaque.
  >
  Monster Manager says, "Hey Faust, let's go down to the Underhall."
  >
  Monster Manager manages to lift a stone in the floor and descends.
  > lift
  With great effort, you manage to lift the stone enought to fit inside.
   
  Once below the stone, it falls back into place, sealing out the light
  from above.  You squirm down the narrow tunnel . . .
   
  You're in UnderHall
  This is a cramped, humid room beneath the Great Hall.  The walls are
  dripping with water condensed from mist rising from the baths.  Some
  of the mist follows the ceiling and dissappears up the narrow tunnel.
   
  Stairs lead north down to the Great Baths.
  A neon sign flashes "Great PIB's Lair" over a door to the South.
  You could manage a crawl through a narrow tunnel leading upwards.
   
  Monster Manager is here.
  > look Monster Manager
  Monster Manager is the stereotype of a computer hacker.  He is wearing
  a flannel shirt with several snickers bars in the breast pocket.  On
  his belt is an ASCII-HEX conversion chart.  On his feet are a scuffed
  pair of hiking boots so he can tackle those dangerous mountains that
  crop up in operations.  Also dangling from his belt is a battered box
  with many buttons on the front and wires with sockets on the ends protruding
  from the back.  The switches seem to have been placed haphazardly, but
  the object is unmistakably one of great power nonetheless.
   
  Monster Manager is in perfect health.
  Monster Manager is empty handed.
  >
  Monster Manager is looking at you.
  >
  Monster Manager swings at you but misses.
  >
  You duck in time to avoid Monster Manager's punch.
  >
  You see stars as Monster Manager bashes you in the face.
  >
  You parry Monster Manager's attack.
  > punch Monster Manager
  You can't punch the Monster Manager.
  > l
  You're in UnderHall
  This is a cramped, humid room beneath the Great Hall.  The walls are
  dripping with water condensed from mist rising from the baths.  Some
  of the mist follows the ceiling and dissappears up the narrow tunnel.
   
  Stairs lead north down to the Great Baths.
  A neon sign flashes "Great PIB's Lair" over a door to the South.
  You could manage a crawl through a narrow tunnel leading upwards.
   
  Monster Manager is here.
  > n
  You're in Great Baths
  These are the luxurious Great Baths where tired adventurers may come
  to relax and try to regain their health and youth from the mineral waters.
  From where you stand at the entrance, you can see below you the bubbling
  soapy pools of water churning violently in tile-lined pits.  The pools
  are fed by hot springs from deep in the rock beneath you.  Steam and
  huge soapy bubbles rise out of the hot pools of water.  The bubbles
  dance through the air, climbing higher and higher, until they either
  burst on the sharp walls of the cave or are lost in the mist above you.
   
  Shallow tiled steps, wet and slick from the hot soapy waters of the
  springs, lead down to the pools.
   
  Rough stone stairs lead up to the south.
   
  >
  In an explosion of orange smoke Monster Vice Manager poofs into the room.
  >
  Monster Manager has come down the stairs from the Underhall.
  >
  Monster Vice Manager produces a "who" list and reads it.
  > system
  System> v
   
                 used   free   total
  Block file    1008     92    1100
  Line file     1501    109    1610
  Room file      283     27     310
  Object file    139     41     180
  Integer file     6      0       6
   
  System>
  Monster Vice Manager is in system maintenance mode.
  System> exit
  >
  Monster Vice Manager is no longer in system maintenance mode.
  > 'Hey Gary
  >
  Monster Vice Manager says, "Hi, Faust."
  > look Monster Vice Manager
  The Monster Vice Manager is dressed in a conservative three piece
  suit.  The stern expression on his face is just a facade, he really
  is a warm and sensitive guy underneath.  He is willing to answer
  any questions and help out with any problems.  He can best be
  described by the phrase:
   
              "Do what thou wilt, so mete it be."
   
  He returns your gaze with a hint of understanding and amusement.
   
  Monster Vice Manager is in perfect health.
  Monster Vice Manager is empty handed.
  >
  Monster Vice Manager is looking at you.
  > punch Monster Vice Manager
  You swing wild and miss.
  > .
  Monster Vice Manager ducks and avoids your punch.
  > .
  A quick punch, but it only grazes Monster Vice Manager.
  >
  You only feel the breeze as Monster Vice Manager swings wildly.
  > .
  You swing wild and miss.
  >
  You see stars as Monster Vice Manager bashes you in the face.
  >
  You only feel the breeze as Monster Vice Manager swings wildly.
  > .
  You deliver a quick jab to Monster Vice Manager's jaw.
  >
  Monster Vice Manager's swing misses you by a yard.
  > .
  Your roundhouse blow sends Monster Vice Manager reeling.
  >
  You double over after Monster Vice Manager lands a mean jab to your stomach!
  Monster Vice Manager looks a little dazed.
  >
  Monster Vice Manager vanishes from the room in a cloud of orange smoke.
  > who
                     Monster Status
                   1-JUN-1988 10:56pm
   
  Username        Game Name                 Where
  dolpher         Monster Manager           great baths
  skrenta         Faust                     great baths
  gary            Monster Vice Manager      inner office
  > poof inner office
   
  This rooms is a conservatively decorated office.  A large
  desk dominates the room.  Several pictures hang on the walls
  and a silver service is on a stand off to the left.  Two plush
  chairs beckon for you to sit down.
   
  There are stairs leading down.
   
  Monster Vice Manager is here.
  Monster Vice Manager looks a little dazed.
  > sh det
  Details here that you may inspect:
      bin
      plaque
      pictures
      stand
  > look bin
   
  The bin has a sign on it saying, "Leave mail for the Monster
  Vice Manager here.  Thank you."
   
  > look plaque
   
  The plaque reads:
   
           Gary Wenslow, Monster Vice Manager
   
  > look pictures
   
  These are very nice pictures of landscapes.  They look expensive.
   
  > look stand
   
  The silver service on this stand is of fine workmanship.
  There are also crystal goblets and flasks containing very
  fine wine, brandy, and whiskey.
   
  > l
   
  This rooms is a conservatively decorated office.  A large
  desk dominates the room.  Several pictures hang on the walls
  and a silver service is on a stand off to the left.  Two plush
  chairs beckon for you to sit down.
   
  There are stairs leading down.
   
  Monster Vice Manager is here.
  Monster Vice Manager looks a little dazed.
  > rooms gary
  gary:
      tunnel of love            more tunnel of love       end of tunnel
      hot dog stand             picnic                    window
      mvm office                inner office              hall1
      hall2                     hall3                     hall4
      hall5                     hall6                     hall7
      hall8                     hall9                     concession
      roll1                     roll2                     roll3
      roll4                     roll5                     roll6
      roll7                     roll8                     roll9
      roll10                    worker's ledge            railing
      rope                      mvm mail room
   
  > rooms dolpher
  dolpher:
      void                      pit of fire               underhall
      great baths               pools                     in the pool
      in the bubble             higher bubble             highest bubble
      ledge                     tower ledge               circular staircase
      behind house              kitchen                   living room
      bottom of stairs          manager's mailbox         tower room
      on the scaffolding        round room                mountain pass
      roof of tower             west passageway           castle entrance
      center hall               outside the gate          east passageway
      narrow passage
   
  > poof behind house
  You're at Behind House
  The back door of the house is boarded up, but the windows have not been
  blocked.  One window at ground level leads into what appears to be the
  kitchen.  All of the other windows are too far above the ground for you
  to reach.
   
  A path leads west to the front of the house.
   
  > form Study
  > poof studty
  There is no room named studty.
  > poof study
  You're in Study
   
  A note on the east wall says "Your exit here."
   
  > refuse east
  Exits east will be refused.
  > l
  You're in Study
   
  > desc
  [ Editing the primary room description ]
  Enter text.  Terminate with ** at the beginning of a line.
  You have 10 lines maximum.
   
   1: This is a luxurious study walled with fine oak paneling.  A window
   2: looks out of the east wall.  It is surrounded by purple curtains.
   3: There is a small sign on the wall.
   4: **
   
  * e
  > l
  You're in Study
  This is a luxurious study walled with fine oak paneling.  A window
  looks out of the east wall.  It is surrounded by purple curtains.
  There is a small sign on the wall.
   
  > desc sign
  [ Editing detail "sign" of this room ]
  Enter text.  Terminate with ** at the beginning of a line.
  You have 10 lines maximum.
   
   1: The note seems to have been hurriedly scrawled.  It reads:
   2:
   3:    "  This room for demonstration purposes only!  "
   4:
   5: **
   
  * ?
   
  A       Append text to end
  C       Check text for correct length with parameter substitution (#)
  D #     Delete line #
  E       Exit & save changes
  I #     Insert lines before line #
  P       Print out description
  Q       Quit: THROWS AWAY CHANGES
  R #     Replace text of line #
  Z       Zap all text
  @       Throw away text & exit with the default description
  ?       This list
   
   
  * p
   
   1: The note seems to have been hurriedly scrawled.  It reads:
   2:
   3:    "  This room for demonstration purposes only!  "
   4:
   
  * e
  > sh det
  Details here that you may isspect:
      sign
  > look sign
  The note seems to have been hurriedly scrawled.  It reads:
   
     "  This room for demonstration purposes only!  "
   
  > l
  You're in Study
  This is a luxurious study walled with fine oak paneling.  A window
  looks out of the east wall.  It is surrounded by purple curtains.
  There is a small sign on the wall.
   
  > desc sign
  [ Editing detail "sign" of this room ]
   
  * i 1
  1:
  2: **
   
  * p
   
   1:
   2: The note seems to have been hurriedly scrawled.  It reads:
   3:
   4:    "  This room for demonstration purposes only!  "
   5:
   
  * e
  > look sign
   
  The note seems to have been hurriedly scrawled.  It reads:
   
     "  This room for demonstration purposes only!  "
   
  > l
  You're in Study
  This is a luxurious study walled with fine oak paneling.  A window
  looks out of the east wall.  It is surrounded by purple curtains.
  There is a small sign on the wall.
   
  > form Behind the Curtains
  > link west
  Hit return alone at any prompt to terminate exit creation.
   
  Room to link to? behind the curtains
  Exit comes out in target room
  from what direction? east
  Exit created.  Use CUSTOM west to customize your exit.
  > l
  You're in Study
  This is a luxurious study walled with fine oak paneling.  A window
  looks out of the east wall.  It is surrounded by purple curtains.
  There is a small sign on the wall.
   
  There is a passage leading west.
   
  > custom west
  Customizing west exit
  If you would rather be customizing this room, type CUSTOM with no arguments
  If you would rather be customizing an object, type CUSTOM <object name>
   
  Type ** for any line to leave it unchanged.
  Type return for any line to select the default.
   
  Custom west> ?
   
  A       Set an Alias for the exit
  C       Conceal an exit
  D       Edit the exit's main Description
  E       EXIT custom (saves changes)
  F       Edit the exit's failure line
  I       Edit the line that others see when a player goes Into an exit
  K       Set the object that is the Key to this exit
  L       Automatically look [default] / don't look on exit
  O       Edit the line that people see when a player comes Out of an exit
  Q       QUIT Custom (saves changes)
  R       Require/don't require alias for exit; ignore direction
  S       Edit the success line
  T       Alter Type of exit (passage, door, etc)
  V       View exit information
  X       Require/don't require exit name to be a verb
  ?       This list
   
  Custom west> a
  Alternate name for the exit? curtains
  Custom west> r
  The alias for this exit will be required to reference it.
  Custom west> d
  Enter a one line description of the exit.
   
  Type ** to leave line unchanged, * to make [no line]
  *
  Custom west> exit
  > l
  You're in Study
  This is a luxurious study walled with fine oak paneling.  A window
  looks out of the east wall.  It is surrounded by purple curtains.
  There is a small sign on the wall.
   
  > go curtains
  You're in Behind the Curtains
   
  There is a passage leading east.
  A note on the floor says "Your exit here."
   
  > e
  You're in Study
  This is a luxurious study walled with fine oak paneling.  A window
  looks out of the east wall.  It is surrounded by purple curtains.
  There is a small sign on the wall.
   
  > desc window
  [ Editing detail "window" of this room ]
  Enter text.  Terminate with ** at the beginning of a line.
  You have 10 lines maximum.
   
   1  You see a green lawn shaded by tall trees and bordered with sculptured
   2: shrubbery.  A small rabbit is nibbling at some grass.  The entire
   3: scene has an artificial look, as if it were some cartoon rendering.
   4: **
   
  * exit
  > sh det
  Details here that you may inspect:
      sign
      window
  > look window
  You see a green lawn shaded by tall trees and bordered with sculptured
  shrubbery.  A small rabbit is nibbling at some grass.  The entire
  scene has an artificial look, as if it were some cartoon rendering.
  > quit
  You vanish in a brilliant burst of multicolored light.
  $

Commands

  You get help of these commands in monster by typing command and 
  questionmark. For example: accept ?

Additional information available:

accept atmosphere brief claim customize dcl describe
destroy disown drop duplicate erase form get
go health hide inventory link look make
bear name monsters objects spells players poof
punch quit relink refuse reveal rooms say
scan reset score search self set show
summon unlink unmake use wear wield whisper
who whois zap help system public

accept

Syntax:        Accept <direction>

Description:   Allows others to link exits here at <direction>
Requirements:  You are the owner of this room
               or you have the Owner -privilege
               or you have the Manager -privilege, 
                  if the owner of this room is System

atmosphere

Syntax:        Atmosphere <your action>
Shortcut:      :<your action>

Description:   Prints other players and you 
               a text <your player name> <your action>

brief

Syntax:        Brief

Description:   Toggles brief printing of room description off or on

claim

Syntax:        Claim
               Claim <object>
               Claim <monster>
               Claim <spell>

Description:   Sets the ownership of <object> or <monster> or <spell> or
                  this room to you
Requirements:  Current ownership of target is Disowned
                  or you have the Manager -privilege

customize

Syntax:        Customize
               Customize <direction>
               Customize <object>
               Customize <monster>
               Customize room
               Customize object <object>
               Customize monster <monster>

Description:   Customizes <object> or <monster> or <direction> or this room
Requirements:  You are the owner of the target
               or you have the Owner -privilege, 
               or you have the Manager -privilege, 
                  if owner of target is System

Bugs:          Following non-existed commands is recognized:
               Customize player <...>
               Customize spell <...>

Additional information available:

Exit-menu Room-menu Object-menu Monster-menu

Exit-menu


  A	Set an Alias for the exit
  C	Conceal an exit
  D	Edit the exit's main Description
  E	EXIT custom (saves changes)
  F	Edit the exit''s failure line
  I	Edit the line that others see when a player goes Into an exit
  K	Set the object that is the Key to this exit
  L	Automatically look [default] / don't look on exit
  O	Edit the line that people see when a player comes Out of an exit
  Q	QUIT Custom (saves changes)
  R	Require/don't require alias for exit; ignore direction
  S	Edit the success line
  T	Alter Type of exit (passage, door, etc)
  V	View exit information
  X	Require/don't require exit name to be a verb
  ?	This list

Room-menu


  A	Define an alternate mystery message block
  B	Edit the target room (G) "bounced in" description   
  C	Define action code (hook) for room   
  D	Alter the way the room description prints   
  E	Exit (same as quit)   
  F	Set the chance of the trapdoor functioning   
  G	Set the location that a dropped object really goes to   
  H	This list   
  I	Edit the default exit failure message   
  M	Define the magic object for this room
  N	Change how the room Name prints
  O	Edit the object drop description (for drop effects)
  P	Edit the Primary room description <the default one> (same as desc)
  Q	Quit (same as exit)
  R	Rename the room
  S	Edit the Secondary room description
  T	Set the direction that the Trapdoor goes to
  V	View settings on this room
  X	Define a mystery message
  1	Set the primary visual link for this room
  2	Set the secondary visual link for this room
  
  ?	This list
  
Hook-menu

  B       Block hook code.
  C       Type COMMANDS.PAPER.
  D       Delete hook.
  E       Exit customizing hook.
  F       Free hook code.
  G       Get program file, default extension is .MDL.
  H       This list.
  L       List hook code.
  M       Run manually hook code.
  O       List hook code to file.
  P       Change hook privilege.
  Q       Exit customizing hook.
  V       View hook.
  ?       This list.

Privilege-menu

  - <privilege>   Remove privilege
  + <privilege>   Add privilege
  E               Exit
  L               List possible privileges.
  Q               Quit (do not save changes)
  V               View current privileges
  ?               This list

Object-menu


  A	"a", "an", "some", etc.
  C	Customizing hook
  D	Edit a Description of the object
  F	Edit the GET failure message
  G	Set the object required to pick up this object
  1	Set the get success message
  K	Set the Kind of object this is
  L	Edit the label description ("There is a ... here.")
  P	Program the object based on the kind it is
  R	Rename the object
  S	Toggle the sticky bit
  
  U	Set the object required for use
  2	Set the place required for use
  3	Edit the use failure description
  4	Edit the use success description
  V	View attributes of this object
  
  X	Edit the extra description
  5	Edit extra desc #2
  E	Exit (same as Quit)
  Q	Quit (same as Exit)
  ?	This list
  
  6	Set home description
  7	Set home of object

Hook-menu

  B       Block the hook code.
  C       Type COMMANDS.PAPER.
  D       Delete the hook.
  E       Exit customizing the hook.
  F       Free the hook code.
  G       Get a program file, default extension is .MDL.
  H       This list.
  L       List the hook code.
  M       Run manually the hook code.
  O       List the hook code to a file.
  P       Change the hook privilege.
  Q       Exit customizing the hook.
  V       View the hook.
  ?       This list.

Privilege-menu

  - <privilege>   Remove a privilege
  + <privilege>   Add a privilege
  E               Exit
  L               List possible privileges.
  Q               Quit (do not save changes)
  V               View current privileges
  ?               This list

Monster-menu


  A       Give monster's level and heal monster.
  B       Block monster
  C       Type COMMANDS.PAPER
  D       Customize the monster's privilege  set.
  E       Exit customizing the monster
  F       Free the monster
  G       Get a program file, the default extension is .MDL
  H       This list
  I       Give the monster's health.
  J       Disable/Enable control access.
  L       List the monster code.
  M       Run manuallytthe monster code
  N       Change the monster name
  O       List the monster code to a file.
  P       Change the monster's privilege
  Q       Exit customizing the monster
  S       Write the monster's self description
  V       View the monster.
  ?       This list

Privilege-menu

  - <privilege>   Remove a privilege
  + <privilege>   Add a privilege
  E               Exit
  L               List possible privileges.
  Q               Quit (do not save changes)
  V               View current privileges
  ?               This list

dcl

Syntax:        Dcl
               Dcl <command>

Description:   Starts a subprocess for shell and  leaves  Monster  running  
               Executes <command>, if given 

describe

Syntax:        Describe 
               Describe <detail>

Description:   Writes a description of <detail> or this room
Requirements:  You are the owner of this room
               or you have the Owner -privilege
               or you have the Manager -privilege, 
                  if the owner of this room is System

destroy

Syntax:        Destroy <object>
               Destroy all
               Destroy <object,...>

Description:   Destroys an instance of object(s) 
Requirements:  You are the owner of the object
               or you have the Owner -privilege
               or you have the Manager -privilege, 
                  if the owner of object is System
               And you are the owner of this room
               or this room is public
               or you have the Owner -privilege
               or you have the Manager -privilege, 
                  if the owner of this room is System

disown

Syntax:        Disown
               Disown <object>
               Disown <monster>
               Disown <spell>

Description:   Sets the ownership of <object> or <monster> or <spell>
                  this room to Disowned
Requirements:  You are the owner of the target
               or you have the Owner -privilege, if target is this room
               or you have the Owner -privilege, 
                  if the target is object or monster
               or you have the Manager -privilege, 
                  if the owner of the target is System

drop

Syntax:        Drop <object>
               Drop all
               Drop <object,...>

Description:   Drops an object

duplicate

Syntax:        Duplicate <object>
               Duplicate all
               Duplicate <object,...>

Description:   Creates an instance of object(s)
Requirements:  You are the owner of the particular object
               or you have the Owner -privilege
               or you have the Manager -privilege, 
                  if the owner of object is System
               And you are the owner of this room
               or this room is public
               or you have the Owner -privilege
               or you have the Manager -privilege, 
                  if the owner of this room is System

erase

Syntax:        Erase <monster>

Description:   Destroys <monster>
Requirements:  You are the owner of the monster
               or you have the Owner -privilege
               or you have the Manager -privilege, 
                  if the owner of monster is System

form

Syntax:        Form <room>

Description:   Creates a new room with the name: <room>
Requirements:  You are the owner of this room
               or this room has some kind of exit with Accept
               or you have the Owner -privilege
               or you have the Manager -privilege, 
                  if the owner of this room is System

get

Syntax:        Get <object>
               Get all
               Get <object,...>

Description:   Gets an object

go

Syntax:        Go <direction>
Shorcut:       <direction>

health

Syntax:        Health

Description:   Shows your health

hide

Syntax:        Hide
               Hide <object>
               Hide all
               Hide <object,...>

Description:   Hides an object or you

inventory

Syntax:        Inventory
               Inventory <player>
               Inventory all
               Inventory <player,...>

Description:   Gives the inventory of <player> or your own inventory
Syntax:        Link <direction>

Description:   Creates a new exit from this room to <direction>
Requirements:  You are the owner of this room
               or <direction> is Accepted
               or you have the Owner -privilege
               or you have the Manager -privilege, 
                  if the owner of this room is System

look

Syntax:        Look
               Look <object>
               Look <monster>
               Look <player>
               Look <detail>
               Look all
               Look <object,...>
               Look <monster,...>
               Look <player,...>

Description:   Looks something. (Gives its description)

make

Syntax:       Make <object>

Description:  Creates a new object with the name: <object>
Requirements: You are the owner of this room
              or this room is public
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if the owner of this room is System

bear

Syntax:       Bear <monster>

Description:  Creates a new monster with the name <object>
Requirements: You are the owner of this room
              or the room is public
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if the owner of this room is System

name

Syntax:       Name <nicename>

Description:  Changes yoy player name to <nicename>

monsters

Syntax:       Monsters
              Monsters <player>
              Monsters all
              Monsters public
              Monsters disowned
              Monsters system

Description:  Shows the objects of <player> or your objects
Requirements: You, Public or Disowned have target
              or you have the Owner -privilege

objects

Syntax:       Objects 
              Objects <player>
              Objects all
              Objects public
              Objects disowned
              Objects system

Description:  Types objects of <player> or your objects
Requirements: You, Public or Disowned have target
              or you have the Owner -privilege

spells

Syntax:       Spells 
              Spells <player>
              Spells all
              Spells public
              Spells disowned
              Spells system

Description:  Types the spells of <player> or your own spells
Requirements: You, Public or Disowned have target
              or you have the Owner -privilege

players

Syntax:       Players
              Players all
              Players monster
              Players player

Description:  Lists players or monsters

poof

Syntax:       Poof <room>
              Poof <player>
              Poof <monster>

Description:  Moves you to <room> or moves <player> or <monster>
Requirements: You are the owner of this room and <room>
              or You have the Poof -privilege

punch

Syntax:       Punch <player>

Description:  Punches <player>
Requirements: Experience of <player> is lower than 700000

quit

Syntax:       Quit
Shortcut:     <F10> 
              Ctrl-Z

Description:  Ends playing
Syntax:       Relink <direction>

Description:  Reroutes an exit to <direction>
Requirements: You are the owner of this room
              You have the Owner -privilege
              You have the Manager -privilege, 
                 if the owner of this room is System

refuse

Syntax:       Refuse <direction>

Description:  Hinders other players to link to <direction>
Requirements: You are the owner of this room
              You have the Owner -privilege
              You have the Manager -privilege, 
                 if the owner of this room is System

reveal

Syntax:       Reveal

Description:  Reveals yourself

rooms

Syntax:       Rooms
              Rooms <player>
              Rooms all
              Rooms public
              Rooms disowned
              Rooms system

Description:  Types all the rooms of <player> or your own rooms
Requirements: the target is either owned by you or public, or is disowned.
              or you have the Owner -privilege

say

Syntax:       Say <message>
Shortcut:     "<message>

Description:  Says a message to other players in this room

scan

Syntax:       Scan <object>
              Scan all
              Scan <object,...>

Description:  Lists all the locations of an object
Requirements: You are the owner of this very object
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if the owner of the object is System
              And you are the owner of this room
              or this room is public
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if the owner of this room is System

reset

Syntax:       Reset <object>
              Reset all
              Reset <object,...>

Description:  Erases all instances of an object from public and your 
                rooms - and from public and your monsters
              Creates one instance of the object to its home location
              Doesn't affect objects that players are carrying
Requirements: There is at least one instance of object in public or your room
                  or carrying by public or your monster
              You are the owner of object
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if the owner of this object is System
              And you are the owner of this room
              or this room is public
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if the owner of this room is System

score

Syntax:       Score
              Score <player>
              Score <level>
              Score all

Description:  Prints your score and level
              or prints score and level of <player>
              or prints players, whose level is <level>
Syntax:       Search

Description:  Searches hidden objects and players

self

Syntax:       Self 
              Self <player>
              Self <monster>
              Self all
              Self <player,...>
              Self <monster,..>

Description:  Creates your own self-description
              or types the self-description of <player>

set

Syntax:       Set <option>

Options:      Password		Change your password
              War               Allow violance in Monster
              Peace             Forbid any violance in Monster
              Spell             Make new spell or customizing spell
              NewPlayer         Set new player's welcome text
              Welcome           Set welcome text
              Privilege         Change your privileges

Spell-menu


  A       Toggle spell mode
  B       Block spell code.
  C       Type COMMANDS.PAPER.
  D       Delete spell.
  E       Exit customizing spell.
  F       Free hook code.
  G       Get program file, default extension is .MDL.
  H       This list.
  I       Change your own level of this hook
  L       List spell code.
  M       Run manually spell code.
  O       List spell code to file.
  P       Change spell privilege.
  Q       Exit customizing spell.
  V       View hook.
  ?       This list.

Privilege-menu


  - <privilege>   Remove privilege
  + <privilege>   Add privilege
  E               Exit
  L               List possible privileges.
  Q               Quit (do not save changes)
  V               View current privileges
  ?               This list

show

Syntax:       Show <option>

Options:      Exits               Lists exits you can inspect here
              Object              Shows internals of an object
              Details             Shows all the details you can look at this room
              Monster             Shows the owner of a monster
              Privileges          Shows your privileges
              Time                Shows time and date
              Room                Shows the owner of a room
              Commands.paper      Lists COMMANDS.PAPER
              Levels              Shows all the experience levels
              Quotas              Show your quotas
              Spell               Show your spell level or what spells you know

summon

Syntax:       Summon <spell name>
              <victim name> (type to prompt)
Syntax:       Unlink <direction>

Description:  Removes exit to <direction>
Requirements: You are the owner of this room
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if the owner of this room is System

unmake

Syntax:       Unmake <object>

Description:  Removes description of <object>
Requirements: You are the owner of object
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if the owner of object is System
              And you are the owner of this room
              or this room is public
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if the owner of this room is System

use

Syntax:       Use <object>

wear

Syntax:       Wear
              Wear <armour>

wield

Syntax:       Wield
              Wield <weapon>

whisper

Syntax:       Whisper <player>

who

Syntax:       Who
              Who all
              Who player
              Who monster

Description:  Lists active players or monsters

whois

Syntax:       Whois <player>
              Whois all
              Whois <player,...>

Description:  Types the username of <player>

zap

Syntax:       Zap <room>

Description:  Removes <room>
Requirements: You are the owner of <room>
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if the owner of <room> is System
              And you are the owner of this room
              or this room is public
              or you have the Owner -privilege
              or you have the Manager -privilege, 
                 if owner of this room is System

help

Syntax:       Help

system

Syntax:       System

Description:  Manages Monster
Requirements: You have the Manager -privilege (which is rare)

System-menu


  1      Customize player database.
  A      Alter player privileges
  B      Add description blocks
  C      Subsystem
  D      Disown <user>
  E      Exit (same as quit)
  H      Add header blocks
  K      Kill <user>
  L      Add one liner records
  M      Move a player who is asleep (not playing now)
  O      Add object records
  P      Write a distribution list of players
  Q      Quit (same as exit)
  R      Add rooms
  T      Throw player out from Monster
  V      View current sizes/usage
  W      List of players
  ?      This list

Authorize-menu

  - <privilege>   Remove privilege
  + <privilege>   Add privilege
  E               Exit
  L               List possible privileges.
  Q               Quit (do not save changes)
  V               View current privileges
  ?               This list

Player-menu

  A      Change player''s health.
  E,Q    for quit.
  L      Change player's level/experience.
  N      Change player's personal name.
  P      Change player's password.
  R      Change player's room quota.
  V      View player''s data.
  H,?    for help.

Subsystem-menu

  A         Block monster''s code.
  B         Block object''s code.
  C         Block room''s code.
  D         Shutdown Monster.
  E         Leave subsystem.
  F         Open Monster for playing.
  G         Block spell's code.
  H         This text.
  I         Customize global MDL code
  M         Claim monster to System.
  O         Claim object to System.
  W         Announce over Monster Universe.
  Q         Leave subsystem.
  R         Claim room to System.
  S         Claim spell to System
  V	    View global flags.
  ?         This text.   

public

Syntax:       Public
              Public <room>
              Public <object>
              Public <monster>
              Public <spell>

Description:  Sets the ownership of room or object or monster or spell
                  or this room to Public
Requirements: You have the Manager -privilege

Editing


  Editing of  block desciptions  uses  simple  line  editor.  Editor 
  executes automatic A(ppend text to end) -command. Give ** alone in
  in line to get follow menu.

  A	Append text to end
  C	Check text for correct length with parameter substitution (#)
  D #	Delete line #
  E	Exit & save changes
  I #	Insert lines before line #
  P	Print out description
  Q	Quit: THROWS AWAY CHANGES
  R #	Replace text of line #
  Z	Zap all text
  @	Throw away text & exit with the default description
  ?	This list
  

MDL

  MDL is language for programming of monsters, objects, rooms and spells.
  Look COMMANDS.PAPER for more info.

Additional information available:

Syntax Parameters Labels Command_Extension_System Funktiot (suomenkielinen)
Functions

Syntax

        function	->	name (p) / name (p,p) / name (p,p,p) /
				name (p,...)

	name 		->	fname /
				GOSUB label / 
				DEFINE variable / 
				SET variable / 
				LABEL label /
				SUBMIT label /
				FOR variable

	label		->	list of words

	p		->	function / const / variable

	const		->	"some text" /
				"some text"&
				const

	fname		->	+ / = / == / === / inv / pinv / players /
				objects / get / pget / drop / pdrop /
				and / or / move / pmove / pprint /
				print / oprint / if / where / null /
				attack / not / random / strip /
                                experience / set experience / pluss /
				difference / times / quotient /
				set state / get state / less / number /
				health / all objects / all players / 
				all rooms / control / include / exclude /
				get remote state / set remote state /
				remote objects / remote players / heal /
				duplicate / pduplicate / destroy / pdestroy /
				string head / string tail / head / tail /
				lookup object / lookup player / lookup room /
				parse object / parse player / parse room /
				privilege / userid / pprint raw / print raw /
				oprint raw / print null / mheal / mattack /
				list / lookup direction / get global flag /
                                spell level / set spell level

	program		->	sentence +


	sentence	->	function /
				- function

  Comments start with ! and end to end of line. ! isn't comment character 
  inside const.

Parameters


  + 		(<line 1>,...,<line n>) 
  = 		(<line 1>,<line 2>) 
  == 		(<line 1>,<line 2>) 
  === 		(<line 1>,<line 2>) 
  inv		() 
  pinv		() 
  players	() 
  objects	() 
  get		(<object list>) 
  pget		(<object list>) 
  drop		(<object list>) 
  pdrop		(<object list>) 
  and		(<item list 1>,<item list 2>,...,<item list n>) 
  or		(<item list 1>,...,<item list n>) 
  move		(<room's name>) 
  pmove		(<room's name>) 
  pprint	(<message part 1>,...,<message part n>) 
  print		(<message part 1>,...,<message part n>) 
  oprint	(<message part 1>,...,<message part n>) 
  pprint raw	(<message part 1>,...,<message part n>) 
  print raw	(<message part 1>,...,<message part n>) 
  oprint raw	(<message part 1>,...,<message part n>) 
  print null	(<message part 1>,...,<message part n>) 
  if 		(<p1>,<action 1>,<action 2>) 
  where		(<monster's or player's name>) 
  null		(<action 1>,<action 2>,<action 3>,...,<action n>) 
  attack	(<attack force: nr>) 
  not		(<p1>)
  random	(<item list>) 
  strip		(<string>) 
  experience	(<player's name>) 
  set experience (<player's new experience>) 
  plus		(<p1: nr>,<p2: nr>)           
  difference	(<p1: nr>,<p2: nr>)
  times		(<p1: nr>,<p2: nr>)
  quotient	(<p1: nr>,<p2: nr>)
  get state	()
  set state	(<string>)
  get global flag	(<flag list>)
  less		(<p1: nr>,<p2: nr>)
  number		(<p1: nr>)
  health		(<player's name>)
  all players	()
  all objects	()
  all rooms	()
  control		(<monster's name>,<action>)
  include		(<string>,<substring>)
  exclude		(<item list>,<sub item list>)
  remote object	(<room name>)
  remote players	(<room name>)
  heal		(<healing amount: nr>)
  duplicate	(<object list>)
  pduplicate	(<object list>)
  destroy		(<object list>)
  pdestroy	(<object list>)
  string head	(<string>)
  string tail	(<string>)
  head		(<item list>)
  tail		(<item list>)
  lookup object	(<object list>)
  lookup player	(<player list>)
  lookup room	(<room list>)
  lookup direction	(<direction list>)
  parse object	(<parameter>)
  parse player	(<parameter>)
  parse room	(<parameter>)
  experience	(<player name>,<privilege list>)
  userid	(<player list>)
  mheal		(<monster name>,<heal amount: nr>)
  mattack	(<monster name>,<attck amont>: nr>)
  list		(<item list 1>,...,<item list n>)
  spell level	()
  set spell level	(level number)
  
  LABEL <label>		(<action 1>,...,<action n>)
  GOSUB <label>		(<param 1>,...,<param n>)
  DEFINE <variable>	(<action>)
  SET <variable>	(<value>)
  SUBMIT <label>	(<delta time>,<player's name>)
  FOR <variable>	(<list>,<action>)

Labels

  When player do something corresponding labels of monsters and hooks
  are executed.

  Default variables in all cases:
  player name		Player's personal name
  monster name		Monster's name (when hook, value of this variable is "")
			(as the control function changes the controlled monster,
			 the value of this variable is also changed)

Additional information available:

Monster Room Object Spell Global_Code

Monster

  Labels and default variables for Monster:
  enter		-			entering room, start game or
					poof to room
  leave		target			leaving room, quit game or
					poof from room
  say		speech			say something
  attack	-			attacking the monster
  look		-			look something in room
  look you	-			look the monster
  command	command			for Command Extension System

Room

  Labels and default variables for hook of rooms:
  start		-			start game
  enter		-			entering room
  escaped	-			leaving room or poof from room
					activated when player is really leave
					room
  leave		target			leaving room
  poof in	-			poof to room
  poof out	target			poof from room
  say		speech			say something
  look detail	detail			look detail in room
  look around	-			look around in room
  command	command			for Command Extension System
  wrong dir	direction		when user gives go <unmatched direction>

Object

  Labels and default variables for hook of objects:
  get fail	-			failing to get object
  get succeed	-			getting object
  drop succeed	-			dropping object ( by drop -command )
  drop you	-			dropping object ( other reason )
  use succeed	-			using object
  look you	-			look object
  command	command			for Command Extension System
  start		-			start game 
  enter		-			entering room
  leave		target			leaving room

Spell

  Labels and default variables for spell's code:
  summon        -                       the victim executes this when
                                        summoner attacks him
  learn         book name               when a player reads a spell
                                        book (that code must use to set 
					spell level for this).
  Spell codes have the default variables "spell name" and "summoner name."

Global_Code

  Labels and default variables for global code:
  start		-			start games
  quit		-			quit games

Command_Extension_System

  When a user types an invalid command, the following will happen:

  1)	form of command is: <something> 
	to hook of room, run label command
	the value of variable command is <something>

  2)	form of command is: <something> <object name>
	to hook of object, run label command
	the value of variable command is <something>

  3)	form of command is: <something> <monster name>
	to monster's code run label command
	the value of variable command is <something>

Funktiot (suomenkielinen)

  Tämä dokumentaatio ei ole ajan tasalla. Tiedostossa
  COMMANDS.PAPER on (toivottavasti) ajan tasalla oleva 
  dokumentaatio.

Additional information available:

+ = inv pinv players objects get
drop and and_then or_else get_global_flag boolean_and boolean_or
move pmove if where null prog not
random strip experience set_experience plus difference times
quotient set_state get_state less number health all_objects
all_players all_rooms control include exclude get_remote_state set_remote_state
remote_objects remote_players heal duplicate pprint print oprint
pget pdrop pduplicate destroy pdestroy or string_head
string_tail tail head lookup_room lookup_player lookup_object parse_player
parse_object parse_room privilege userid attack spell_level set_spell_level

+

  Funktio: + (p1,p2)

  Laskee parametrien p1 ja p2 arvon.

  Palauttaa arvonnaan p1:n ja p2:n arvot yhdistettynä yhdeksi 
  merkkijonoksi siten, että niiden välillä on yksi välilyönti. 

  Virhetilanteet: 
     - yhdistetty merkkijono pitempi kuin 1000 merkkiä
       > Tulos: Parametrin p1 arvo

  Tulkinta:
    p1    - merkkijono
    p2    - merkkijono
    tulos - merkkijono

=

  Funktio: =(p1, p2)
  Funktio: ==(p1,p2)
  Funktio: ===(p1,p2)

  Laskee parametrien p1 ja p2 arvon.

  Funktiot =, == ja === palauttavat ensimmäisen parametrin arvon, 
  kun parametrit ovat samat, muutoin tyhjän. Funktioiden tulkinta, 
  siintä mitkä merkkijonot ovat samoja vaihtelee: = -funktion on 
  tiukin ja === -funktion tulkinta on löysin. = vaatii täsmällisen 
  vastaavuuden, jossa välilyönnit huomioidaan. ==  ei  huomioi lo-
  pussa olevia välilyöntejä. === tiivistää ennen vertailua välilyön-
  nit ja muuttaa isot kirjiamet pieniksi.

  Tulkinta:
     p1    - merkkijono
     p2    - merkkijono
     tulos - merkkijono (totuusarvo?)

  Huomautus:
   - Aiempi = -funktio on nyt nimellä ==. Siis = toimii nyt eri-
     lailla kuin aiemmin. Tosin se nyt toimii niin kuin se oli 
     aiemmin dokumentoitu.

inv

  Funktio: inv ()

  Palauttaa arvonaan monsterin mukana olevien esineiden lista.

  Virhetilanteet:
     - Suorituksessa oleva koodi ei ohjaa monsteria
       > Tulos: Tyhjä merkkijono

  Tulkinta:
    tulos - lista

pinv

  Funktio: pinv ()

  Palauttaa arvonaan (toiminnan laukaisseen) pelaajan mukana olevien 
  esineiden listan.

  Tulkinta:
    tulos - lista

players

  Funktio: players ()

  Palauttaa arvonaan niiden pelaajien listan, jotka ovat samas-
  sa huoneessa kuin monster.

  Virhetilanteet:
    - Suorituksessa oleva koodi ei ohjaa monsteria
      > Tulos: niiden pelaajien lista, jotka ovat samassa huone-
         essa kuin (toiminnan laukaissut) pelaaja.

  Tulkinta:
     tulos - lista

objects

  Funktio: objects ()

  Palauttaa arvonaan niiden esineden listan, jotka ovat samassa 
  huoneessa kuin monster.

  Virhetilanteet:
     - Suorituksessa oleva koodi ei ohjaa monsteria
       > Tulos: Niiden esineiden lista, jota ovat samassa huone-
         essa kuin (toiminnan laukaissut) pelaaja.

  Tulkinta:
     tulos - lista

get

  Funktio: get (p1)

  Laskee parametrin p1 arvon.

  Ottaa maasta monsterin mukaan p1:n ilmoittamat esineet.

  Palauttaa arvonaan niiden esineiden lista, jotka todella saa-
  tiin otettua.

  Virhetilanteet:
     - Suorituksessa oleva koodi ei ohjaa monsteria
       > Ei toimintaa, tulos: Tyhjä merkkijono/lista

  Tulkinta:
     p1    - lista
     tulos - lista

drop

  Funktio: drop (p1)

  Laskee parametrin p1 arvon.

  Pudottaa maahan monsterilta p1:n ilmoittamat esineet.

  Palauttaa arvonaan listan niistä esineistä, jotka 
  todella saatiin pudotettua.

  Virhetilanteet:
     - Suorituksessa oleva koodi ei ohjaa monsteria
       > Ei toimintaa, tulos: Tyhj{ merkkijono/lista

  Tulkinta:
     p1    - lista
     tulos - lista

and

  Funktio: and (p1,p2,...,pn)

  Laskee parametrien p1 arvon.

  Palauttaa listan, jossa on ne alkiot, jotka ovat sekä p1:ssä 
  että p2:ssa. Jokainen alkio esiintyy tuloksessa vain kerran.

  Tulkinta:
     p1    - lista
     p2    - lista
     ...
     pn    - lista
     tulos - lista
  Huomautus:
     Parametreja pitää vähintään olla kaksi.

and_then

  Funktio: and then (p1,p2,...,pn)
  
  Laskee parametrien arvoja kunnes jonkun parametrin arvo on tyhjä
  merkkijono (tai kaikki parametrit tuli lasketuksi).

  Palauttaa viimeisen lasketun paramatrin arvon.

  Tulkinta:
     pN    - totuusarvo / merkkijono
     tulos - totuusarvo / merkkijono

or_else

  Funktio: or else (p1,p2,...,pn)

  Laskee parametrien arvoja kunnes joku parametri palauttaa ei-tyhjän
  merkkijonon (tai kunnes kaikki paramatrit tuli lasketuksi).

  Palauttaa viimeisen lasketun paramaterin arvon.

  Tulkinta:
     pN    - totuusarvo / merkkijono
     tulos - totuusarvo / merkkijono

get_global_flag

  Funktio: get global flag (p1)

  Laskee parametrin p1 arvon.

  Palauttaa argumentin p1 luettelemista globaaleista lipuista ne,
  jotka ovat epätosia.
  
  Globaalit liput ovat: "Active", "Valid" ja "Wartime".

  Virhetilanteet:
    - p1:n listassa oleva alkio ei ole globaali lippu
      => kyseinen alkio tulkitaan globaaliksi lipuksi, joka on epätosi

  Tulkinta:
     p1    - lista
     tulos - lista

Huomautus: 
    - Funktion toiminta on muuttunut. Aiemmein funktio palautti jokaista
      globaalia lippua kohti, joka oli tosi, yhden "TRUE" -arvon listassa. 

boolean_and

  Funktio: boolean and(p1,...,pn)

  Laskee parametrien arvon.

  Palautaa "TRUE", jos kaikkien pametrien arvo oli ei tyhjä, muutoin
  palauttaa "".

  Tulkinta:
    p1    - totuusarvo
       .
       .
       .
    pn    - totuusarvo
    tulos - totuusarvo

boolean_or

  Funktio: boolean or(p1,...,pn)

  Laskee parametrien arvon.

  Palautaa "TRUE", jos vähintään yhden parametrien arvo oli ei tyhjä, 
  muutoin palauttaa "".

  Tulkinta:
    p1    - totuusarvo
       .
       .
       .
    pn    - totuusarvo
    tulos - totuusarvo

move

  Funktio: move (p1)

  Laskee parametrin p1 arvon.

  Siirtää monsterin p1:n ilmoittamaan huoneeseen.

  Palauttaa huoneen nimen, jonne siirsi monsterin.

  Vaatimukset:
      - Jos kohde huone ei ole julkinen eikä monsterin omistajan 
        omistuksessa, niin monsterilla pitää olla poof -privile-
        gio.

  Virhetilanteet:
      - Kohde ei ole huone
        > Tulos: tyhj{ nimi/merkkijono
      - Siirto ei onnistu jostain syystä (esim. poof privilegio-
        ta olisi tarvittu)
        > Tulos: tyhjä nimi/merkkijono
      - Suoritettava koodi ei ohjaa monsteria
        > Tulos: tyhjä nimi/merkkijono

  Tulkinta:
      p1    - nimi
      tulos - nimi

pmove

  Funktio: pmove (p1)

  Laskee parametrin p1 arvon.

  Siirtää  (toiminnan laukaisseen)  pelaajan p1:n  ilmoittamaan 
  huoneeseen.

  Palauttaa huoneen nimen, jonne siirsi pelaajan.

  Vaatimukset:
      - Jos kohde huone ei ole julkinen eikä monsterin omistajan 
        omistuksessa, niin monsterilla pitää olla poof -privilegio.
      - Koodi pitää olla privileged moodissa.

  Virhetilanteet:
      - Kohde ei ole huone
        > Tulos: tyhjä nimi/merkkijono
      - Siirto ei onnistu jostain syystä (esim. poof privilegio-
        ta olisi tarvittu)
        > Tulos: tyhjä nimi/merkkijono
      - Suoritettava koodi ei ohjaa monsteria ja  poof  privile-
        giota olisi tarvittu
        > Tulos: tyhjä nimi/merkkijono
      - Koodi ei ole privileged-moodissa
        > Tulos: tyhjä nimi/merkkijono

  Tulkinta:
      p1    - nimi
      tulos - nimi

if

  Funktio: if (p1,p2,p3)

  Laskee parametrin p1 arvon.

  Laskee parametrin p2 arvon, jos p1 ei ollut tyhjä, muutoin 
  laskee parametrin p3 arvon.

  Palauttaa p2 tai p3, riippuen siitä kumman arvon laski.

  Tulkinta:
     p1    - merkkijono
     p2    - merkkijono
     p3    - merkkijono
     tulos - merkkijono

  Huomautus:
      - Puuttuvat parametrit tulkitaan tyhjiksi (tämä koskee 
        myös muita funktiota).
      - Koodin ei siis tarvitse ohjata monsteria,  jos  poof 
        privilegiota ei tarvita.

where

  Funktio: where (p1)

  Laskee parametrin p1 arvon.

  Palauttaa huoneen, jossa pelaaja p1 on.

  Virhetilanteet:
     - p1 ei ole pelajan nimi
       > tulos: tyhjä nimi/merkkijono
     - Pelaaja p1 ei pelaa funktion kutsuhetkellä
       > tulos: huone, johon pelaaja lopetti pelaamisen

  Tulkinta:
     p1    - nimi
     tulos - nimi

null

  Funktio: null (p1,p2,p3,...)

  Laskee parametrien p1, p2 ja p3 arvon.

  Palautaa tyhjän merkkijonon.

  Tulkinta:
     p1   - merkkijono
     p2   - merkkijono
     p3   - merkkijono

  Huomautus:
     - Sopii peräkkäisen toiminnan toteuttamiseen.

prog

  Funktio: prog (p1, p2, p3, ...)

  Palauttaa viimeisen parameterin arvon.

  Tulkinta:
     p1   - merkkijono
     p2   - merkkijono
          .
          .
          .
  Huomautus:
     - Sopii peräkkäisen toiminnan toteuttamiseen.

not

  Funktio: not (p1)

  Laskee parametrin p1 arvon.

  Palauttaa "TRUE", jos p1 on "", muutoiin palauttaa "".

  Tulkinta:
     p1    - merkkijono
     tulos - merkkijono (?) / totuusarvo

random

  Funktio: random (p1)

  Laskee parametrin p1 arvon.

  Palauttaa yhden satunnaisesti valitun alkion p1:n listasta.

  Virhetilanteet:
     - p1 on tyhjä
       > Tulos: tyhjä nimi/merkkijono

  Tulkinta:
     p1    - lista
     tulos - nimi

strip

  Funktio: strip (p1)

  Laskee parametrin p1 arvon.

  Palauttaa p1:n muutettuna isot kirjaimet muutettuina 
  pieniksi kirjaimiksi, numerot sellaisinaan ja muut 
  merkit korvattuna välilyönnillä.Monsterin merkkitau-
  lukko määrää mitkä merkit ovat kirjaimia - katso kohta 
  CHARTABLE alustustiedostossa MONSTER.INIT.

  Tulkinta:
     p1    - merkkijono
     tulos - merkkijono

  Huomatus:
     - Useiden välilyöntien sarja (kuten kaikissa muissakin 
       funktiossa) korvaatuu yhdellä välilynillä.
     - Funktio on käyttökelpoinen poistettaessa välimerkke-
       jä pelaajan puheesta.
     - Merkit joiden tyyppi on "none" merkkitaulukossa pois-
       tetaan kokonaan (ei korvata välilyönnillä).

experience

  Funktio: experience (p1)

  Laskee parametrin p1 arvon.

  Palauttaa pelaajan p1 pisteet.

  Virhetilanteet:
     - p1 ei ole pelaajan nimi
       > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - nimi
     tulos - luku

set_experience

  Funktio: set experience (p1)

  Laskee parametrin p1 arvon.

  Asettaa (toiminnnan laukaisseen) pelaajan kokemukseksi p1:n.

  Palauttaa p1:n.

  Vaatimukset:
     - Monserilla pitää olla experience -privilegio.
     - Pelaaja ei voi olla monsterin omistaja tai se, joka
       on ladannut koodin.

  Virhetilanteet:
     - Koodi ei ohjaa monsteria
       > Ei toimintaa, tulos: tyhjä merkkijono
     - Monsterilla ei experience privilegiota
       > Ei toimintaa, tulos: tyhjä merkkijono
     - (Toiminnan laukaissut) pelaaja on monsterin omistaja tai
       koodin lataaja.
       > Ei toimintaa, tulos: tyhjä merkkijono

  Tulkinta:
     p1    - luku
     tulos - luku

  Huomautus:
     - Funktiolla ei voi muuttaa omaa kokemusta.

plus

  Funktio: plus (p1,p2)

  Laskee parametrien p1 ja p2 arvon.

  Palauttaa lukujen p1 ja p2 summan.

  Virhetilanteet:
     - p1 tai p2 ei ole luku
       > Tulos: tyhjä merkkijono
     - Lukualueen ylivuoto
       > Tulos: tyhjä merkkijono

  Tulkinta:
     p1    - luku
     p2    - luku
     tulos - luku

difference

  Funktio: difference(p1,p2)

  Laskee parametrien p1 ja p2 arvon.

  Palauttaa erotuksen p1 miinus p2.

  Virhetilanteet:
     - p1 tai p2 ei ole luku
       > Tulos: Tyhjä merkkijono
     - Lukualueen ylivuoto
       > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - luku
     p2    - luku
     tulos - luku

times

  Funktio: times(p1,p2)

  Laskee parametrien p1 ja p2 arvon.

  Palauttaa parametrien p1 ja p2 tulon.

  Virhetilanteet:
     - Lukualueen ylivuoto
       > Tulos: Tyhjä merkkijono
     - p1 tai p2 eiv{t ole lukuja
       > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - luku
     p2    - luku
     tulos - luku

quotient

  Funktio: quotient(p1,p2)

  Laskee parametrien p1 ja p2 arvon.

  Palauttaa p1 jaettuna p2:lla (kokonaislukujako).

  Virhetilanteet;
     - p1 tai p2 ei ole luku
       > Tulos: Tyhjä merkkijono
     - p2 on nolla
       > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - luku
     p2    - luku
     tulos - luku

set_state

  Funktio: set state(p1)

  Laskee parametrin p1 arvon.

  Sijoittaa p1 koodikohtaiseen pysyv{{n muuttujaan.

  Palauttaa p1:n.

  Tulkinta:
     p1    - merkkijono
     tulos - merkkijono

  Huomatus: 
     - Muuttuja on koodikohtainen eli jokaisella monsterilla, 
       ja huoneen ja esineen hookilla on oma muuttuja. 
     - control -funktio ei vaikuta siihen, ett{ mihin muuttu-
       jaan set state vaikuttaa.

get_state

  Funktio: get state(p1)

  Lukee koodikohtaisen pysyvän muuttujan arvon.

  Palauttaa muuttujan arvon.

  Tulkinta:
     tulos - merkkijono

  Huomatus: 
     - Muuttuja on koodikohtainen eli jokaisella monsterilla, 
       ja huoneen ja esineen hookilla on oma muuttuja. Saman
       esineen eri ilmentymillä on sama koodi, joten muuttu-
       jakin on yhteinen.                              
     - control -funktio ei vaikuta siihen, että mistä muuttu-
       jasta get state lukee arvon.

less

  Funktio: less(p1,p2)

  Laskee parametrien p1 ja p2 arvon.

  Jos p1 on pienempi kuin p2 palauttaa "TRUE", muutoin tyhjän 
  merkkijonon.

  Virhetilanteet:
     - p1 tai p2 ei ole luku
       > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - luku
     p2    - luku
     tulos - merkkijono, totuusarvo (?)

number

  Funktio: number(p1)

  Laskee parametrin p1 arvon.

  Palauttaa p1, jos p1 on luku, muutoin palauttaa tyhjän merkki-
  jonon.

  Tulkinta:
    p1    - luku (?)
    tulos - luku (?)

health

  Funktio: health(p1)

  Laskee parametrin p1 arvon.

  Palauttaa pelaajan tai monsterin p1 voiman lukuarvon.

  Virhetilanteet:
     - p1 ei ole palaajan tai monsterin nimi
       > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - nimi
     tulos - luku

all_objects

  Funktio: all objects()

  Funktio palauttaa listan kaikkista esineist{.

  Virhetilanteet:
     - Esineitä on enemmän kuin mahtuu 1000 merkin listaan
       > Tulos: Niin monen ensimm{isen esineen lista, jotka mah-
         tuivat 1000 merkkiin.

  Tulkinta:
     - tulos: lista

  Huomautus:
     - Jokainen määritelty esine esiintyy listassa kerran riip-
       pumatta siitä kuinka monta kappaletta sitä  on  olemassa 
       (vaikka sitä olisi olemassa 0 kappaletta).

all_players

  Funktio: all players()

  Funktio palauttaa listan kaikkista pelaajista ja hirviäistä.

  Virhetilanteet:
     - Pelaajia on enemmän kuin mahtuu 1000 merkin listaan
       > Tulos: Niin monen ensimmäisen pelaajan lista, jotka 
         mahtuivat 1000 merkkiin.

  Tulkinta:
     - tulos: lista

all_rooms

  Funktio: all rooms()

  Funktio palauttaa listan kaikkista huoneista.

  Virhetilanteet:
   - Huoneita on enemmän kuin mahtuu 1000 merkin listaan
     > Tulos: Niin monen ensimm{isen huoneen lista, jotka mah-
       tuivat 1000 merkkiin.

  Tulkinta:
     - tulos: lista

control

  Funktio: control(p1,p2)

  Funktio laskee parametrin p1 arvon.

  Funktio asettaa parametrin p2 laskemisen ajaksi ohjattavaksi 
  monsteriksi p1:n. Suoritettavalla  koodilla  ja  monsterilla 
  pitää olla sama omistaja.

  Palauttaa p2:n.

  Virhetilanteet:
     - p1 ei ole monsterin nimi
       > Funktio ei laske paramerin p2 arvoa - Tulos: Tyhjä merk-
         kijono
     - Suoritettavalla koodilla ja p1 määräämmällä monsterilla ei 
       ole sama omistaja
       > Funktio ei laske parametrin p2 arvoa - Tulos: Tyhjä merk-
         kijono

  Tulkinta:
     p1    - nimi
     p2    - merkkijono
     tulos - merkkijono

  Huomautus:
     - Vaadittavat privilegiot katsotaan ohjattavalta monseril-
       ta, joten funktio vaikuttaa niihin
     - Funktio ei vaikuta privileged -moodiin
     - p2:n suorituksen ajaksi funktio sijoittaa muuttujaan 
       monster name ohjattavan monserin nimen eli p1:n

include

  Funktio: include(p1,p2)

  Funktio laskee parametrien p1 ja p2 arvon.

  Palauttaa p2:n, jos p1 sisältää p2:n, muutoin tyhj{n merkki-
  jonon.

  Virhetilanteet:
     - p2 on tyhjä merkkijono
       > Tulos: Tyhjä merkkijono
     - p1 on tyhj{ merkkijono
       > Tulos: tyhjä merkkijono

  Tulkinta:
     p1    - merkkijono
     p2    - merkkijono
     tulos - merkkijono

  Huomautus:
     - Nuo 'virhetilanteet' sopivat kyllä funktion normaalikäy-
       töksen puitteisiin eli kyseessä ei ole todellisia virhe-
       tilanteita -  mutta tilanteet ovat sen verran erikoisia, 
       että ne oli syytä mainita erikseen.

exclude

  Funktio: exclude (p1,p2)

  Laskee parametrien p1 ja p2 arvon.

  Palauttaa arvonaan ne alkiot listasta p1, joita ei ole listas-
  sa p2.

  Tulkinta:
    p1    - lista
    p2    - lista
    tulos - lista

get_remote_state

  Funktio: get remote state (p1)

  Laskee parametrin p1 arvon.

  Palauttaa arvonaan p1 ilmoittaman monsterin pysyvän muuttujan 
  arvon (eli state kentän arvon).  Monsterilla  pitää olla sama 
  omistaja kuin suoritettavalla koodilla tai monsteri pitää olla 
  julkinen ja koodin ohjaamalla monsterilla pitää olla object 
  -privilegio.

  Virhetilanteet:
      - p1 ei ole monsterin nimi
        > Tulos: Tyhjä merkkijono
      - p1:llä on eri omistaja kuin suoritettavalla koodilla
        > Tulos: Tyhjä merkkijono
      - p1 on julkinen ja koodi ei ohjaa monsteria
        > Tulos: Tyhjä merkkijono
      - p1 on julkinen ja koodin ohjaamalla monsterilla ei ole 
        object -privilegiota
        > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - nimi
     tulos - merkkijono

set_remote_state

  Funktio: set remote state (p1,p2)

  Laskee parametrien p1 ja p2 arvon.

  Sijoittaa  p1  ilmoittaman  monsterin pysyvän muuttujaan p2:n 
  arvon (eli state kentään). Monsterilla pitää olla sama omista-
  ja kuin suoritettavalla koodilla tai monsteri pitää olla jul-
  kinen ja koodin ohjaamalla monsterilla pitää olla object -pri-
  vilegio.

  Palauttaa p2:n arvon.

  Virhetilanteet:
      - p1 ei ole monsterin nimi
        > Ei toimintaa - tulos: Tyhjä merkkijono
      - p1:llä on eri omistaja kuin suoritettavalla koodilla
        > Ei toimintaa - tulos: Tyhjä merkkijono
      - p1 on julkinen ja koodi ei ohjaa monsteria
        > Ei toimintaa - tulos: Tyhjä merkkijono
      - p1 on julkinen ja koodin ohjaamalla monsterilla ei ole 
        object -privilegiota
        > Ei toimintaa - tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - nimi
     p2    - merkkijono
     tulos - merkkijono

remote_objects

  Funktio: remote objects (p1)

  Laskee parametrin p1 arvon.

  Palauttaa huoneessa p1 (maassa) olevien esineiden nimet.

  Virhetilanteet:
      - p1 ei ole huoneen nimi
        > Tulos: Tyhj{ merkkijono

  Tulkinta:
     p1    - nimi
     tulos - lista

remote_players

  Funktio: remote players (p1)

  Laskee parametrin p1 arvon.

  Palauttaa huoneessa p1 olevien pelaajien nimet.

  Virhetilanteet:
      - p1 ei ole huoneen nimi
        > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - nimi
     tulos - lista

  Huomautus:
     - Pelaajien listaan ei sis{lly monstereita toisin kuin all 
       players(), lookup player() ja parse player() funktioiden 
       kohdalla
     - Funktio toimii vastaavasti kuin players() funktio - pait-
       si, että huone valitaan parametrin avulla

heal

  Funktio: heal (p1)

  Laskee parametrin p1 arvon.

  Nostaa toiminnan laukaiseen pelaajan terveyttä (voimia) para-
  metrin ilmoittmalla määrällä.

  Palauttaa p1:n.

  Virhetilanteet:
      - p1 ei ole luku
        > Ei toimintaa - tulos: Tyhjä merkkijono
      - p1 on negatiivinen
        > Ei toimintaa - tulos: Tyhjä merkkijono

  Tulkinta:
˙    p1    - luku
     tulos - luku

  Huomautus: 
      -   Mikäli (toiminnan laukaisseen) pelaajan nykyisen ter-
          veyden ja lisäyksen summa on  suurempi  kuin pelaajan 
          tason maksimiterveys, funktio asettaa pelaajalle tämän 
          tason maksimiterveyden - tämä  ei  kuitenkaan  vaikuta
          funktion palauttamaan arvoon.

duplicate

  Funktio: duplicate (p1)

  Laskee parametrin p1 arvon.

  Tekee niistä esineistä, jotka on mainittu listassa p1 monste-
  rin mukaan uuden kappaleen. Esineillä ja monsterilla pitää ol-
  la sama omistaja tai monsterilla pitää olla object -privilegio.

  Palauttaa listan niistä esineistä, jotka todella sai tehtyä.

  Virhetilanteet:
	  - Koodi ei ohjaa monsteria
	    > Ei toimintaa: tulos: Tyhjä merkkijono
          - Esineellä ei ole sama omistaja kuin monsterilla ja 
            monsterilla ei ole object -privilegiota
	    > Esinettä ei tule palautettavaan listaan eikä mons-
              terin mukaan.
          - Esine ei mahdu mukaan
	    > Esinettä ei tule palautettavaan listaan eikä mons-
              terin mukaan.

  Tulkinta:
     p1    - lista
     tulos - lista

pprint

  Funktio: pprint (p1,p2,p3,...)
  Funktio: pprint raw (p1,p2,p3,...)

  Laskee parametrin p1,p2 ja p3 arvon.

  Tulostaa (toiminnan laukaiseelle) pelaajalle parametrien teks-
  tin. Edellisen parametrin perään  funktio  lisää  välilyönnin, 
  jos seuraava alkaa kirjaimella tai numerolla.  Tekstin  perään 
  funktio lisää pisteen, jos se loppuu kirjaimeen tai numeroon. 
  Funktio aloittaa virkeen isolla  kirjaimella.  raw -versio  ei 
  muokkaa tekstiä.

  Palauttaa tulostamansa tekstin.

  Virhetilanteet:
     - Teksti on pitempi kuin 1000 merkkiä
       > Osa tekstistä jää pois (sekä tuloksesta, että tulosteesta).

  Tulkinta:
     p1    - merkkijono
     p2    - merkkijono
     p3    - merkkijono
     tulos - merkkijono

  Huomautus:
     - Rivijakoon ei ole mahdollista vaikuttaa. Funktio päättää 
       rivijaon itse.

print

  Funktio: print (p1,p2,p3,...)
  Funktio: print raw (p1,p2,p3,...)

  Laskee parametrin p1,p2 ja p3 arvon.

  Tulostaa monsterin kanssa  samassa  huoneessa  oleville pelaa-
  jille  parametrin tekstin. Edellisen parametrin perään funktio 
  lisää välilyönnin, jos seuraava alkaa kirjaimella tai numerol-
  la. Tekstin perään funktio lisää pisteen,  jos se loppuu  kir-
  jaimeen tai numeroon. Funktio aloittaa virkkeen isolla kirjai-
  mella. raw -versio ei muokkaa tekstiä.

  Palauttaa tulostamansa tekstin.

  Virhetilanteet:
     - Suoritettava koodi ei ohjaa monsteria
        > Tulostaa toiminnan laukaisseen pelaajan kanssa samas-
          sa huoneessa oleville pelaajille parametrien tekstin, 
          tulos: parametrien teksti
     - Teksti on pitempi kuin 1000 merkkiä
       > Osa tekstistä jää pois (sekä tuloksesta, että tulostees-
          ta).

  Tulkinta:
      p1    - merkkijono
      p2    - merkkijono
      p3    - merkkijono
      tulos - merkkijono

  Huomautus:
      - Jos (toiminan laukaissut) pelaaja on siis samassa huo-
        neessa kuin  monster, niin teksti tulostuu myös hänelle.
      - Erittäin monirivisillä viesteillä on mahdollista yli
        kuormittaa  Monsterin tapahtumienvälitysjärjestelmä (jo-
        kainen rivi on yksi tapahtuma), jolloin osaa tapahtumis-
        ta on mahdollista hukkua.
      - Rivijakoon ei ole mahdollista vaikuttaa. Funktio päättää 
        rivijaon itse.

oprint

  Funktio: oprint (p1,p2,p3,...)
  Funktio: oprint raw (p1,p2,p3,...)

  Laskee parametrin p1,p2 ja p3 arvon.

  Tulostaa monsterin kanssa samassa huoneessa oleville  pelaajil-
  le parametrien tekstin, paitsi toiminnan laukaiseelle pelaajal-
  le. Edellisen parametrin perään funktio lisää  välilyönnin, jos 
  seuraava alkaa kirjaimella tai numerolla.  Tekstin perään funk-
  tio lisää pisteen, jos se loppuu kirjaimeen tai numeroon. Funk-
  tio aloittaa virkkeen isolla kirjaimella.  raw -versio ei muok-
  kaa tekstiä.

  Palauttaa tulostamansa tekstin.
 
  Virhetilanteet:
     - Suoritettava koodi ei ohjaa monsteria
       > Tulostaa toiminnan laukaisseen pelaajan kanssa samas-
         sa huoneessa oleville pelaajille parametrien  tekstin 
         (paitsi toiminnan laukaiseelle  pelaajalle), tulos: 
         tulostettava teksti
     - Teksti on pitempi kuin 1000 merkkiä
       > Osa tekstistä jää pois (sekä tuloksesta, että tulos-
         teesta).

  Tulkinta:
      p1    - merkkijono
      p2    - merkkijono
      p3    - merkkijono
      tulos - merkkijono

  Huomautus:
      - Erittäin monirivisillä viesteillä on mahdollista yli-
        kuormittaa Monsterin tapahtumienvälitysjärjestys (jo-
        kainen rivi on yksi tapahtuma), jolloin osan tapahtu-
        mista on mahdollista hukkua.
      - Rivijakoon ei ole mahdollista vaikuttaa. Funktio päät-
        tää rivijaon itse.

pget

  Funktio: pget (p1)

  Laskee parametrin p1 arvon.

  Ottaa maasta (toiminnan laukaisseen) pelaajan mukaan p1:n il-
  moittamat esineet.

  Palauttaa arvonaan listan niistä esineistä, jotka todella saa-
  tiin otettua.

  Vaatimukset:
     - koodi pitää olla privileged-moodissa

  Virhetilanteet:
     - koodi ei ole privileged moodissa
       > Ei toimintaa, funktio ei laske parametrin p1 arvoa,
         tulos: Tyhjä merkkijono/lista                     

  Tulkinta:
     p1    - lista
     tulos - lista

pdrop

  Funktio: pdrop (p1)

  Laskee parametrin p1 arvon.

  Pudottaa (toiminnan laukaisseen) pelaajalta  maahan  p1:n  il-
  moittamat esineet.

  Palauttaa arvonaan lista esineistä, jotka todella saatiin  pu-
  dotettua.

  Vaatimukset:
     - koodi pitää olla privileged-moodissa

  Virhetilanteet:
     - koodi ei ole privileged moodissa
       > Ei toimintaa. Funktio ei laske parametrin p1 arvoa
         - tulos: Tyhjä merkkijono/lista

  Tulkinta:
     p1    - lista
     tulos - lista

  Huomautus: 
       Ilmoittaa (toiminnan laukaisseelle) pelaajalle ja muille 
       pelaajille, jos esineen  pudottaminen  aiheutti  esineen 
       riisumisen (vertaa: wear ja  wield komennot.)

pduplicate

  Funktio: pduplicate (p1)

  Laskee parametrin p1 arvon.

  Tekee niistä esineistä, jotka on mainittu listassa p1 pelaajan  
  mukaan uuden kappaleen. Esineillä ja koodilla pitää olla sama 
  omistaja tai monsterilla pitää olla object -privilegio. 

  Palauttaa listan niistä esineistä, jotka todella sai tehtyä.

  Vaatimukset:
	- koodi pitää olla privileged -moodissa.

  Virhetilanteet:
	- Koodi ei ole privileged tilassa
	  > Ei toimintaa. Funktio ei laske parametrin p1 arvoa,
            tulos: Tyhjä merkkijono
        - Esineellä ei ole sama omistaja kuin koodilla ja koodi 
          ei ohjaa monsteria
	  > Esinettä ei tule palautettavaan listaan eikä pelaa-
            jan mukaan.
        - Esineellä ei ole sama omistaja kuin koodilla ja mons-
          terilla ei ole object -privilegiota.
	  > Esinettä ei tule palautettavaan listaan eikä pelaa-
            jan mukaan.
        - Esine ei mahdu mukaan
	  > Esinettä ei tule palautettavaan listaan eikä pelaajan
	    mukaan.

  Tulkinta:
     p1    - lista
     tulos - lista

destroy

  Funktio: destroy (p1)

  Laskee parametrin p1 arvon.

  Tuhoaa monsterilta ne esineet jotka on mainittu listassa p1. 
  Esineillä ja monsterilla pitää olla sama omistaja tai monste-
  rilla pitää olla object -privilegio.

  Palauttaa listan niistä esineistä, jotka todella sai tuhottua.

  Virhetilanteet:
	- Koodi ei ohjaa monsteria
	  > Ei toimintaa: tulos: Tyhjä merkkijono
        - Esineellä ei ole sama omistaja kuin monsterilla ja 
          monsterilla ei ole object -privilegiota
	  > Esinettä ei tule palautettavaan listaan eikä esine 
            tuhoudu.

  Tulkinta:
     p1    - lista
     tulos - lista

pdestroy

  Funktio: pdestroy (p1)

  Laskee parametrin p1 arvon.

  Tuhoaa pelaajalta ne esineet jotka on mainittu listassa p1. 
  Esineillä ja monsterilla pitää olla sama omistaja tai monste-
  rilla pitää olla object -privilegio.

  Palauttaa listan niistä esineistä, jotka todella sai tuhottua.

  Vaatimukset:
	- koodi pitää olla privileged -moodissa.

  Virhetilanteet:
	- Koodi ei ole privileged tilassa
	  > Ei toimintaa. Funktio ei laske parametrin p1 arvoa,
            tulos: Tyhjä merkkijono
        - Esineellä ei ole sama omistaja kuin koodilla ja koodi
          ei ohjaa monsteria
	  > Esinettä ei tule palautettavaan listaan eikä esine 
            tuhoudu.
        - Esineellä ei ole sama omistaja kuin koodilla ja mons-
          terilla ei ole object -privilegiota.
	  > Esinettä ei tule palautettavaan listaan eikä esine 
            tuhoudu.

  Tulkinta:
     p1    - lista
     tulos - lista

or

  Funktio: or (p1,p2,p3,...)

  Laskee parametrien p1,p2,p3,... arvon.

  Palauttaa listan, jossa on ne alkiot, jotka ovat p1:ssä, 
  p2:ssa tai p3:ssa (jne). Jokainen alkio esiintyy tuloksessa 
  vain kerran.

  Virhetilanteet:
   - Tuloksena syntyvä lista on pitempi kuin 1000 merkkiä
     > Tulos: lista, jossa on vain niin monta alkiota, että ne 
       mahtuvat 1000 merkkiin.

  Tulkinta:
     p1    - lista
     ...
     p<n>   - lista
 ˙    tulos - lista

string_head

  Funktio: string head (p1)

  Laskee parametrin p1 arvon.

  Palauttaa merkkijonosta p1 ensimmäisen sanan (merkkijonon ekaan  
  välilyöntiin saakka).

  Virhetilanteet:
	- p1 on tyhjä merkkijono
	  > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - merkkijono
     tulos - merkkijono

string_tail

  Funktio: string tail (p1)

  Laskee parametrin p1 arvon.

  Palauttaa merkkijonon p1 ensimmäistä sanaa lukuunottamatta 
  (merkkijonon ekasta välilyännistä alkaen).

  Virhetilanteet:
	- p1 on tyhjä merkkijono
	  > Tulos: Tyhjä merkkijono
	- p1:ssä vain yksi sana
	  > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - merkkijono
     tulos - merkkijono

tail

  Funktio: tail (p1)

  Laskee parametrin p1 arvon.

  Palauttaa listan p1 ensimmäistä alkiota lukuunottamatta.

  Virhetilanteet:
	- p1 on tyhjä lista
	  > Tulos: Tyhjä lista/merkkijono
	- p1:ssä vain yksi alkio
	  > Tulos: Tyhjä lista/merkkijono

  Tulkinta:
     p1    - lista
     tulos - lista
  Funktio: head (p1)

  Laskee parametrin p1 arvon.

  Palauttaa listan p1 ensimmäisen alkion.

  Virhetilanteet:
	- p1 on tyhjä lista
	  > Tulos: Tyhjä merkkijono

  Tulkinta:
     p1    - lista
     tulos - alkio

lookup_room

  Funktio: lookup room (p1)

  Laskee parametrin p1 arvon.

  Täydentää listan p1 alkiot huoneiden nimiksi. Jos jonkin alki-
  on täydennys ei onnistu, kyseinen alkio jää pois tuloslistasta.

  Tulkinta:
     p1    - lista
     tulos - lista

lookup_player

  Funktio: lookup player (p1)

  Laskee parametrin p1 arvon.

  Täydentää listan p1 alkiot pelaajien ja monsterien nimiksi. 
  Jos jonkin alkion täydennys ei onnistu, kyseinen alkio  jää 
  pois tuloslistasta.

  Tulkinta:
     p1    - lista
     tulos - lista

lookup_object

  Funktio: lookup object (p1)

  Laskee parametrin p1 arvon.

  Täydentää listan p1 alkiot esineiden nimiksi. Jos jonkin alki-
  on täydennys ei onnistu, kyseinen alkio jää pois tuloslistasta.

  Tulkinta:
     p1    - lista
     tulos - lista

parse_player

  Funktio: parse player (p1)

  Laskee parametrin p1 arvon.

  Funktio tarjoaa samanlaisen parametrin tulkintapalvelun kuin 
  on käytössä monsterin komennoissa, joissa voi käyttää jokeri-
  merkkiä.

  Palauttaa parametria p1 vastaavan pelaaja ja monster -listan. 

  Virhetilanteet:
    - p1 on tyhjä merkkijono
      > Tulos: Tyhjä merkkijono
    - parametrin tulkinnassa tapahtuu virhe
      > Tulos: Tyhjä merkkijono

  Tulkinta:
      p1    - merkkijono
      tulos - lista

parse_object

  Funktio: parse object (p1)

  Laskee parametrin p1 arvon.

  Funktio  tarjoaa samanlaisen parametrin tulkintapalvelun kuin 
  on käytössä monsterin komennoissa, joissa voi käyttää jokeri-
  merkkiä.

  Palauttaa parametria p1 vastaavan esinelistan. 

  Virhetilanteet:
    - p1 on tyhjä merkkijono
      > Tulos: Tyhjä merkkijono
    - parametrin tulkinnassa tapahtuu virhe
      > Tulos: Tyhjä merkkijono

  Tulkinta:
      p1    - merkkijono
      tulos - lista

parse_room

  Funktio: parse room (p1)

  Laskee parametrin p1 arvon.

  Funktio tarjoaa samanlaisen parametrin tulkintapalvelun kuin 
  on käytössä monsterin komennoissa, joissa voi k{yttää jokeri-
  merkkiä.

  Palauttaa parametria p1 vastaavan huonelistan. 

  Virhetilanteet:
    - p1 on tyhjä merkkijono
      > Tulos: Tyhjä merkkijono
    - parametrin tulkinnassa tapahtuu virhe
      > Tulos: Tyhjä merkkijono

  Tulkinta:
      p1    - merkkijono
      tulos - lista

privilege

  Funktio: privilege (p1,p2)

  Laskee parametrien p1 ja p2 arvon.

  Palauttaa  listan  niistä pelaajan (taikka monsterin) p1 pri-
  vilegeista, jotka ovat mainittu listassa p2. Mahdolliset pri-
  vileget: wizard, manager, experience, quota, object, poof, 
  special ja monster. wizard -privilege tarkoittaa, ett{ pelaaja 
  on Monster Manager.

  Virhetilanteet:
	- p1 ei ole pelaajan tai monsterin nimi
	  > Tulos: Tyhjä merkkijono/lista
	- p2:ssa on mainittu privilege, jota ei ole olemassa
	  > Tulos: Kyseinen privilege ei tule tulokseen mukaan

  Tulkinta:
     p1    - nimi
     p2    - lista
     tulos - lista

userid

  Funktio: userid (p1)

  Funktio laskee parametrin p1 arvon.

  Funktio vaatii toimiakseen, että ohjattavalla monsterilla on 
  experience  -privilegio.

  Palauttaa listan, jossa p1:n pelaajien nimet on vaihdettu vas-
  taaviksi käyttäjätunnuksiksi.

  Virhetilanteet:
	- koodi ei ohjaa monsteri taikka ohjattavalla monsteril-
          la ei ole experience -privilegiota
	  > Funktio ei laske parametrin p1 arvoa, Tulos: Tyhjä 
            merkkijono
	- Listassa p1 on nimi, joka ei ole pelaajan taikka mons-
          terin nimi
	  > Ei tule mukaan tulokseen
	- listssa on nimi, joka on monsterin nimi
	  > Tulle mukaan tulokseen, userid -käyttää monsterien
	    käyttäjätunnuksina ohjelman sisäistä esitysmuotoa 
            (monster id), joka on yksik{sitteinen

  Tulkinta:
      p1    - lista
      tulos - lista

attack

  Funktio: attack (p1)

  Laskee parametrin p1 arvon.

  Vähentää (toiminnan laukaisseen) pelaajan voimina p1:n ilmoit-
  taman määrän, kuitenkaan ei enemm{n kuin monsterin kokemus an-
  taa myötä. Peräkkäisten hyökkäysten summa ei saa ylittää mons-
  terin kokemuksen määrääm{{ rajaa.

  Palauttaa millä voimalla hyökättiin.

  Vaatimukset:
     - Monsteri ei saa olla hyökännyt jo kokemuksen m{{r{{n rajan 
       verran
     - Pelaaja ei saa olla suojattu.
     - Hookeilla vaatii privileged -moodin

  Virhetilanteet:
     - Monsteri on hyökännyt jo kokemuksen määräämän rajan verran
       > Ei toimintaa - Tulos: tyhjä merkkijono
     - pelaaja on suojattu
       > Ei toimintaa - Tulos: tyhjä merkkijono
     - p1 ei ole luku
       > Ei toimintaa - Tulos: tyhjä merkkijono
     - p1 on suurempi kuin kokemus antaa my|t{
       > Hyökätään voimalla jonka kokemus antaa my|ten, Tulos: 
         voima jolla hyökättiin
     - koodi ei ohjaa monsteria ja privileged -moodi päällä
       > ei rajaa hyökkäyksen voimakkuudella
     - koodi ei ohjaa monsteria ja ei privileged -moodia
       > Ei toimintaa - Tulos: tyhjä merkkijono
 
  Tulkinta:
     p1    - luku
     tulos - luku

  Huomautus:
     - Funktio ei kerro, kuinka hyvin hyökkäys todelisuudessa 
       onnistui. (On mahdollista saada selville funktion health 
       avulla.)
     - Funktio ei vaadi en{{n privileged moodia monsterilta

spell_level

  Funktio: spell level()

  Palauttaa taian käyttäjän kyseisen tain taitotason. Toimii vain 
  suoritettaessa tain koodissa (labelit summon ja learn). 

  Virhetilanteet:
         - Käytetään muualla kuin taissa
           > Tulos: Tyhjä (merkkijono)

  Tulkinta:
     tulos - luku

  Huomaa:
         - Taian käyttäjä (muutujassa summoner name) on eri kuin
           koodin suorittaja (poikkeus: learn -label)

set_spell_level

  Funktio: set spell level(p1)

  Laskee parametrin p1 arvon.

  Asettaa taian käyttäjän kyseisen tain taitotason. Toimii vain 
  suoritettaessa tain koodissa (labelit summon ja learn). Taso 0 
  merkitsee, ett{ pelaaja ei osa taikaa, positiivinen luku merkit-
  see, ett{ pelaaja osaa taian. 

  Palautaa asetetun taian tason.

  Virhetilanteet:
         - Käytetään muualla kuin taissa
           > Tulos: Tyhjä (merkkijono)
         - p1 ei luku
           > Tulos: Tyhjä (merkkijono)
         - p1 < 0
           > Tulos: Tyhjä (merkkijono)

  Tulkinta:
     p1    - luku
     tulos - luku

  Huomaa:
         - Taian käyttäjä (muuttujassa summoner name) on eri kuin
           koodin suorittaja (poikkeus: learn -label)

         - Tämä funktio on tarkoitettu taian opettamiseen pelajalle
           (learn -labelissa)

         - Muuttujasta book name voi tarkistaa mikä kirja (magic book)  
           on  käynistänyt taian  learn  -labelin.  

Functions


  This documentation is not up-to-date. Especially, the
  number of function parameters is not restricted to three
  even if this document says so. The file COMMANDS.PAPER
  contains the up-to-date documentation.

  N.B:

  In this documentation, "result" means the return value.  

Additional information available:

+ = inv pinv players objects get
drop and move pmove if where null
prog not random strip experience set_experience plus
difference times quotient set_state get_state less number
health all_objects all_players all_rooms control include exclude
get_remote_state set_remote_state remote_objects remote_players heal duplicate pprint
print oprint pget pdrop pduplicate destroy pdestroy
or string_head string_tail tail head lookup_room lookup_player
lookup_object parse_player parse_object parse_room privilege userid attack
spell_level set_spell_level

+

  Function: + (p1,p2)

  Evaluates p1 and p2.

  Returns p1 " " p2 ( p1, a space, and p2 concatenated ).

  Errors:
     - the result string is over 1000 characters long
       => the result is p1

  Interpretation:
    p1, p2, result: strings

=

  Function: =(p1, p2)
  Function: ==(p1,p2)
  Function: ===(p1,p2)

  Evaluates parameters p1 and p2.

  Functions =, == ja === return p1 when the evaluated parameters are 
  equal; otherwise an empty string is returned. The functions range from
  "=", which is the strictest, to "===", which is a general purpose 
  predicate.

  Name		Description
  ----------------------------------------------------------------
  =             Are two argument values exactly the same string ?

  ==		Are two argument values -- excluding spaces -- the 
                same string ?

  ===		Are two argument values -- excluding spaces and 
   	        the case -- the same string ?
  ----------------------------------------------------------------

  Interpretation:
    p1, p2 : string
    result : string ( boolean )

  N.B:
   - the previous function "=" is currently named "==". 

inv

  Function: inv ()

  Returns the list of items the monster is carrying.

  Errors:
     - The code is not monster code ( e.g. the code is for a room )
       => the result is an empty string

  Interpretation:
    result : list

pinv

  Function: pinv ()

  Returns the list of items of the player who triggered the action.

  Interpretation:
   result : list

players

  Function: players ()

  Returns the list of those players currently in the same room
  with the monster.

  Errors:
   - The code is not monster code.
     => the result is the list of those players currently in the
     same room with the player who triggered the action

  Interpretation:
     result : list

objects

  Function: objects ()

  Returns the list of the items currently in the same room with
  the monster.

  Errors:
   - the code is not monster code
      => the result is the list of those players currently in the
      same room with the player who triggered the action

  Interpretation:
     result : list

get

  Function: get (p1)

  Evaluates p1.

  Tries to pick up the items found in the list p1.

  Returns the list of the items successfully picked up.

  Errors:
     - The code is not monster code
       => No actions, an empty string/list is returned

  Interpretation:
     p1     : list
     result : list

drop

  Function: drop (p1)

  Evaluates p1.
  Forces the monster drop the items found in the list p1.

  Returns the list of the items that were dropped.

  Errors:
     - The code is not monster code.
       => No action, an empty string is returned

  Interpretation:
     p1     : list
     result : list

and

  Function: and (p1,p2,...)

  Evaluates p1, p2, ..., pn.

  Returns a list of the items found in both p1 and p2.
  Every item is included only once.

  Interpretation:
     pN, result : list
  N.B.
    There must be at least two parameters.

move

  Function: move (p1)

  Evaluates p1.

  The value of p1 is the room the monster is moved.
  
  Returns the name of the room the monster was transferred.

  Requirements:
      - If the target room is not public or owned by the monster 
        owner, the monster must have the "poof" privilege.

  Errors: 
     - The target is not a room. 	
       or 
     - Moving is unsuccessful ( e.g. the "poof" privilege would 
       have been needed ) 
       or
     - The code is not monster code. 
       => result is an empty string/name

  Interpretation:
      p1, result : name

pmove

  Function: pmove (p1)

  Evaluates p1.

  The player that triggered the action is moved to the room 
  found in p1.

  Returns the name of the room the player was moved.

  Requirements:
      - If the target room is not public, or owned by the monster owner,
        the monster must have the "poof" privilege.
      - The code must be in the "privileged" mode.

  Errors:
      - The target is not a room.
	or
      - The moving is unsuccessful 
	or
      - The code is not monster code and the "poof" privilege
        would have been needed.
	or
      - The code is not in the "privileged" mode.
        => the result is an empty string/name

  Interpretation:
      p1, result : name

if

  Function: if (p1,p2,p3)

  Evaluates p1.

  Evaluates p2 if p1 was non-empty, otherwise evaluates p3.

  Returns either p2 or p3, depending on which one was evaluated.

  Interpretation:
     p1, p2, p3, result : string 

  Requirements:
      - missing parameters are thought to be empty ( applicable
        to all the other functions )
      - The code does NOT have to be a monster code, if the
        "poof" privilege is not needed.

where

  Function: where (p1)

  Evaluates p1.
  
  Returns the name of the room the player p1 currently is.

  Errors:
     - p1 is not a player name.
       => the result is an empty string/name
     - Player p1 is currently not playing.
       => the result is the room where the player quitted.
  Interpretation:
     p1, result : name    

null

  Function: null (p1,p2,p3,...)

  Evaluates parameters p1, p2, p3, ...

  Returns an empty string.

  Interpretation:
	p1, p2, p3, ... : string
  N.B:
     - Ideal for a sequential action

prog

  Function: prog (p1, p2, p3, ...)

  Evaluates all parameters.
  Return the value of the last parameter.

  Interpretation:
     p1, p2, ... : string
  N.B:
    - Good for a sequential action

not

  Function: not (p1)

  Evaluates p1.
 
  Returns "TRUE" if p1 is empty; otherwise an empty string
  is returned.

  Interpretation:
     p1  : string
     result : string ( ? ) / boolean 

random

  Function: random (p1)

  Evaluates p1.

  Returns one randomly chosen item from the list p1.

  Errors:
     - p1 is empty
       => the result is an empty string/name

  Interpretation:
     p1     : list
     result : name

strip

  Function: strip (p1)

  Evaluates p1.
  
  Changes alphabets A-Z into lowercase and all other characters
  into spaces. Returns the converted string.

  Interpretation:
     p1, result : string

   N.B:
     - Subsequent spaces are compressed into one 
       ( applicable to all the other functions, too )
     - This function is useful for removing punctuation
       marks from a player speech ( unfortunately some
       non-standard alphabets, e.g. a-umlaut, are lost )

experience

  Function: experience (p1)

  Evaluates p1.

  Returns the score of player p1.

  Errors:
     - p1 is not a player name
       => the result is an empty string/name

  Interpretation:
     p1     : name
     result : number

set_experience

  Function: set experience (p1)

  Evaluates parameter p1.

  Sets p1 to be the experience of the player who triggered the action.

  Returns p1.

  Requirements:
     - The monster must have the "experience" privilege
     - The player cannot be the monster owner or the person
       who loaded the monster code

  Errors:
     - The code is not for a monster
       => no action, an empty string is returned
     - The monster does not have the "experience" privilege
       => no action, an empty string is returned
     - The player who triggered the action owns the monster or
       loaded the code
       => no action, an empty string is returned

  Interpretation:
     p1, result : number

  N.B:
     - The function cannot be used to change the monster's own experience

plus

  Function: plus (p1,p2)

  Evaluates p1 and p2.
  
  Returns the sum of p1 and p2.

  Errors:
     - p1 or p2 is not a number
	or
     - Overflow
       => the result is an empty string	
  Interpretation:
     p1, p2, result : number

difference

  Function: difference(p1,p2)

  Evaluates p1 and p2.
  
  Returns p1 minus p2.

  Errors:
     - p1 or p2 is not a number
	or
     - Overflow
       => the result is an empty string	
  Interpretation:
     p1, p2, result : number

times

  Function: times(p1,p2)

  Evaluates p1 and p2.

  Returns p1 multiplied with p2.

  Errors:
     - p1 or p2 is not a number
	or
     - Overflow
       => the result is an empty string	
  Interpretation:
     p1, p2, result : number

quotient

  Function: quotient(p1,p2)

  Evaluates p1 and p2.

  Returns p1 divided by p2 ( integer division,
  all fractions dropped )

  Errors:
     - p1 or p2 is not a number
	or
     - Overflow
       => the result is an empty string	
  Interpretation:
     p1, p2, result : number

set_state

  Function: set state(p1)

  Evaluates p1.

  Assigns the value of p1 to the code dependent ( static )
  variable ( one per a code ).

  Returns the value of p1.

  Interpretation:
     p1, result : string

  N.B:
     - The variable is code dependent, that is, every monster,
       and hook has its own variable ( state variable ).
     - The function "control" does not affect the variable 
       "set state" uses.
Example
  ! Example for using set state 
  !               and get state
  ! and control
  !
  ! MDL code for the object "demo object"
  !
  ! There is also a monster called "demo monster"
  !    it has no MDL code
  !    but has the "experience" privilege
  !
  ! When player picks up this object first time, he gets 100 points
  !
  !
  ! This is called when failed to get the object.
  - LABEL get fail()
  !
  ! This is called when getting succeeded.
  - LABEL get succeed(
        if(and(get state(),player name), ! Is player name in the state var ? 
           "",			         ! Aye: Do not give points 
           GOSUB give point()            ! Nay: Give points
          )
    )
  !
  ! This is called when dropping succeeded
  - LABEL drop succeed()
  !
  ! This is called when the object is dropped unintentionally
  - LABEL drop you()
  !
  ! This is called when the object is used successfully
  - LABEL use succeed()
  !
  ! This is called when a player looks at the object
  - LABEL look you()
  !
  ! This is called when a player commands 'something demo object'
  - LABEL command(pprint("You can't ",command," demo object."))
  !
  ! This is called when a player starts a game session in the same
  ! room with the object.
  - LABEL start()
  !
  ! This is called when a player enters the room where the object is.
  - LABEL enter()
  !
  ! This is called when a player leaves the room (or game) where object is.
  - LABEL leave()
  !
  ! 
  ! The following labels are the code's very own.
  !
  - LABEL give point(
  	control("demo monster",		! For gaining the "experience" privilege
  					! from "demo monster"
  	  prog(set experience(		! Set player's new experience
  		plus(			! +
  		    experience(         ! get player experience
                         player name),
  		    "100"               ! Number 100, quotes are compulsory
                  )
                 ),
  	      set state(		! Set code's new state
  		or(player name,		! add player name to the state list
                     get state()	! old state list
  		)
  	      )
            )
          )
    )

get_state

  Function: get state(p1)

  Reads the value of the code dependent variable.

  Returns the value.

  Interpretation:
     result : string

  N.B:
     - see set_state for more information

less

  Function: less(p1,p2)

  Evaluates p1 and p2.

  If the value of p1 is less than the value of p1, "TRUE"
  is returnes; otherwise an empty string is returned.

  Errors:
     - p1 or p2 is not a number
       => the result is an empty string

  Interpretation:
     p1, p2 : number
     result : string / boolean 

number

  Function: number(p1)

  Evaluates p1.
  
  Returns the value of p1 if p1 is a number, otherwise an empty
  string is returned.

  Interpretation:
    p1, result : number 

health

  Function: health(p1)

  Evaluates p1.

  Returns the health of p1 ( player or monster ).

  Errors:
     - p1 is not a player or monster name
       => the result is an empty string

  Interpretation:
     p1     : name
     result : number

all_objects

  Function: all objects()

  Returns the list of all objects.

  Errors:
     - All the objects do not fit into a 1000-character list
       => only those objects that fit into a 1000-character 
       list are returned

  Interpretation:
     - result: list

  Huomautus:
     - Every ( defined ) object is included only once ( even
       if there exists 0 or multiple copies of it )

all_players

  Function: all players()

  Returns the list of all players and monsters.

  Errors:
     - All the players and monsters do not fit into a 1000-character
       list
       => only those players and monsters who fit into a 
       1000-character list are returned

  Interpretation:
     result : list

all_rooms

  Function: all rooms()

  Returns the room list.

  Errors:
   - The room list does not fit into a 1000-character list
     => only those rooms that fit into a 1000-character list
     ( in order of appearance ) are included

  Interpretation:
     result : list

control

  Function: control(p1,p2)

  Evaluates p1.

  While p2 is evaluated the function controls the monster called
  p1. The code and the monster ( p1 ) must have the same owner.

  Returns p2.

  Errors:
     - p1 is not a monster name
       or
     - The code and the monster ( p1 ) do not have the same owner
       => p2 is not evaluated; the result is an empty string

  Interpretation:
     p1         : name
     p2, result : string

  N.B:
     - Any required privilege is checked from the monster that
       is controlled; the function may affect them.
     - The function does not affect the privileged mode.
     - While p2 is executed the "monster name" variable is 
       temporarily assigned the monster to be controlled, that
       is, p1.

include

  Function: include(p1,p2)

  Evaluates p1 and p2.

  Returns p2 if p1 includes p2; otherwise an empty string is
  returned.

  Errors:
     - p1 or p2 ( or both ) is an empty string
       => the result is an empty string
  Interpretation:
     p1, p2, result : string

  N.B:
    - The errors do actually fit into the normal behaviour,
      they are not real errors, but those situations are 
      that special that they are worth mentioning

exclude

  Function: exclude (p1,p2)

  Evaluates p1 and p2.

  Returns a list of those items in p1 not found in p2.

  Interpretation:
    p1, p2, result : list

get_remote_state

  Function: get remote state (p1)

  Evaluates p1.

  Returns the value of the static variable ( the "state" field )
  of the monster named p1. The monster ( p1 ) must have the same
  owner as the code, or the monster must be public and the ( other )
  monster executing the code must have the object privilege.

  Errors:
      - p1 is not a monster name
        or
      - p1 and the code have a different owner
        or
      - p1 is public and the code is not monster code
	or
      - p1 is public and the code ( that is monster code ) does
        not have the object privilege
        => the result is an empty string

  Interpretation:
     p1     : name
     result : string

set_remote_state

  Function: set remote state (p1,p2)

  Evaluates p1 and p2.

  Assign the value of p2 to the static variable of the monster p1.
  The monster p1 must have the same owner as the code, or it must
  be public and the code ( or, to be precise, the monster 
  whose code it is ) must have the "object" privilege.

  Return p2.

  Errors:
      - p1 is not a monster name
        or
      - p1 and the code have a different owner
        or
      - p1 is public and the code is not monster code
	or
      - p1 is public and the code ( that is monster code ) does
        not have the object privilege
        => the result is an empty string

  Interpretation:
     p1         : name
     p2, result : string

remote_objects

  Function: remote objects (p1)

  Evaluates p1.

  Returns a list of objects lying on the ground in the room p1.

  Errors:
      - p1 is not a room
        => an empty string is returned

  Interpretation:
     p1     : name
     result : list

remote_players

  Function: remote players (p1)

  Evaluates p1.

  Returns a list of players in the room p1.

  Errors:
      - p1 is not a room
        => an empty string is returned

  Interpretation:
     p1     : name
     result : list

  N.B:
     - Monsters are excluded, making the behaviour a wee bit 
       different from the functions players(),
       lookup players(), and parse players().
     - The behaviour is similar to players(), except that the room
       is chosen with a parameter.

heal

  Function: heal (p1)

  Evaluates p1.

  Increases the health ( strength ) of the player who triggered 
  the action by p1 points.

  Returns p1.

  Errors:
      - p1 is not a number or p1 is negative
        => the result is an empty string

  Interpretation:
˙    p1,  result : number

  N.B:
      - If the present strength of a player added with the 
        increase is greater than his maximum strength only
        the maximum health is set. However, the return value
        is not affected.

duplicate

  Function: duplicate (p1)

  Evaluates p1.

  One extra copy is created from the objects included in the
  list p1. The copies are automatically picked up by the monster.
  The objects and the monster must have the same owner, or the 
  monster must have the "object" privilege.

  Return a list of items the were successfully duplicated.

  Errors:
	  - The code is not monster code
            => no action; an empty string is returned
          - An object does not have the same owner as the monster
            and the monster does not have the "object" privilege,
            or the object does not fit in ( the monster carries
            too many objects )
            => The object is neither copied nor ( naturally ) 
            picked up by the monster.

  Interpretation:
     p1, result : lista

pprint

  Function: pprint (p1,p2,p3,...)
  Function: pprint raw (p1,p2,p3,...)

  Evaluates p1, p2, p3, ...

  Parameter text is printed to the player who triggered the action.
  One space is inserted after a parameter if the following parameter 
  starts with an alphanumeric. A colon (".") is inserted in the very 
  end if text ends with an alphanumeric. A sentence is capitalised.

  Pprint raw does not format text.

  Returns the printed text.

  Errors:
     - Text is longer than 1000 chars
	=> it is truncated ( somehow )

  Interpretation:
     pN, result : string

  N.B:
     - The function decides by itself how to split the text
       into lines.
  Function: print (p1,p2,p3,...)
  Function: print raw (p1,p2,p3,...)

  Evaluates parameters.

  Parameter text is printed to all the players currently in the same 
  room with the monster.
  One space is inserted after a parameter if the following parameter 
  starts with an alphanumeric. A colon (".") is inserted in the very 
  end if text ends with an alphanumeric. A sentence is capitalised.

  Print raw does not format text.

  Returns the printed text.

  Errors:
     - Text is longer than 1000 chars
	=> it is truncated ( somehow )
     - The code is not monster code
        => text is printed to all the players ( but not to the
	player who triggered the action ) in the room
	
  Interpretation:
     pN, result : string

  N.B:
     - The function decides by itself how to split the text
     - If the player ( who triggered the action ) is in the
       same room with the monster the text is also printed 
       to him.
     - Very long messages ( many lines ) may overload the 
       Monster event transmission system the result of which 
       may be the loss of some events.

oprint

  Function: oprint (p1,p2,p3,...)
  Function: oprint raw (p1,p2,p3,...)

  Evaluates parameters.

  Parameter text is printed to all the players currently in the
  same room with the monster ( but not to the player who triggered
  the action ).
  One space is inserted after a parameter if the following parameter 
  starts with an alphanumeric. A colon (".") is inserted in the very 
  end if text ends with an alphanumeric. A sentence is capitalised.

  Oprint raw does not format text.

  Return the printed text.

  Errors:
     - Text is longer than 1000 chars
	=> it is truncated ( somehow )

  Interpretation:
     pN, result : string

  N.B:
     - The function decides by itself how to split the text
     - If the player ( who triggered the action ) is in the
       same room with the monster the text is also printed 
       to him.
     - Very long messages ( many lines ) may overload the 
       Monster event transmission system the result of which 
       may be the loss of some events.
 
  Errors:
     - The code is not monster code
        => text is printed to all the players ( but not to the
	player who triggered the action ) in the room
     - The text is longer than 1000 chars
        => it is truncated ( somehow )
  Interpretation:
      pN, result : string

pget

  Function: pget (p1)

  Evaluates p1.

  Picks up the objects found in the list p1 and gives them to
  the player who triggered the action.

  Returns a list of the objects which were successfully picked up.

  Requirements:
     - The code must be in the "privileged" mode.

  Errors:
     - The code is not in the "privileged" mode
	=> no action; p1 is not evaluated (!); the result is an 
        empty string

  Interpretation:
     p1, result : list

pdrop

  Function: pdrop (p1)

  Evaluates p1.

  The player who triggered the action is dropped all the objects
  found in the list p1.

  Returns a list of the objects which were successfully dropped.

  Requirements:
	- The code must be in the "privileged" mode.

  Errors:
     - The code is not in the "privileged" mode
	=> no action; p1 is not evaluated (!); the result is an 
        empty string

  Interpretation:
     p1, result : list

  N.B:
     - Informs everybody ( in the same room ) if the action
       resulted in stripping off an object ( compare: wear
       and wield )

pduplicate

  Function: pduplicate (p1)

  Evaluates p1.

  The objects found in the list p1 are duplicated and given
  to the player ( who, again, triggered the action ). The 
  objects and the code must have the same owner or the monster
  must have the "object" privilege.

  Returns a list of objects that were duplicated.

  Requirements:
	- the code must be in the "privileged" mode

  Errors:
	- the code is not in the "privileged" mode
   	  => no action; p1 is not evaluated; the result is
          an empty string
	- an object does not have the same onowner as the code
          and the code is not monster code
          or
        - an object does not have the same owner as the code and
	  the code does not have the "object" privilege
          or
        - the player cannot take any more objects
          => the object is not duplicated

  Interpretation:
     p1, result : list

destroy

  Function: destroy (p1)

  Evaluates p1.

  Destroys all the objects found in the list p1. The objects 
  and the monster must have the same owner oror the monster
  must have the "object" privilege.

  Returns a list of the destroyed objects.
                          
  Errors:
	- the code is not monster code
	  => no action; an empty string is returned
	- an object and the monster does not have the same
	  owner and the monster does not have the "object"
	  privilege
          => the object is not destroyed 

  Interpretation:
     p1, result : list    

pdestroy

  Function: pdestroy (p1)

  Evaluates p1.

  Destroys all the objects found in the list p1 from the 
  player. The objects and the monster must have the same
  owner or the monster must have the "object" privilege.

  Returns a list of destroyed objects.

  Requirements:
	- the code must be in the "privileged" mode

  Errors:
	- the code is not in the "privileged" mode
	  => no action; an empty string is returned
        - an object and the code does not have the same
	  owner and te code is not mosnter code
	  or
	- an object and the monster does not have the same
	  owner and the monster does not have the "object"
	  privilege
          => the object is not destroyed 

  Interpretation:
     p1, result : list    

or

  Function: or (p1,p2,p3,...)

  Evaluates p1, p2, p3,...

  Returns a list of items found in pN. Every item is included
  only once.

  Errors:
   - the result list is longer than 1000 characters
     => the result is a list containing only so many items
     that fit into 1000 chars. 

  Interpretation:
     pN, result : list

string_head

  Function: string head (p1)

  Evaluates p1.

  Returns the first word of the string p1.

  Errors:
	- p1 is an empty string
	  => Ran emprty string is returned

  Interpretation:
     p1, result : string

string_tail

  Function: string tail (p1)

  Evaluates p1.

  Returns the tail of string p1 ( all except the first word ).

  Errors:
	- p1 is an empty string
	  or
	- p1 contains only one word
	  => an empty string is returned

  Interpretation:
     p1, result : string

tail

  Function: tail (p1)

  Evaluates p1.

  Returns the list p1 excluding the first item.

  Errors:
	- p1 is an epmty list
	  or
	- p1 has only one item
	  => an empty list/string is returned

  Interpretation:
     p1, result : list

head

  Function: head (p1)

  Evaluates p1.

  Returns the first item of the list p1.

  Errors:
	- p1 is an empty list
	  => an empty string is returned

  Interpretation:
     p1     : list
     result : item

lookup_room

  Function: lookup room (p1)

  Evaluates p1.

  Parses the items found in the list p1 to room names. If 
  a parsing is unsuccessfull that item is exculded from the
  result list.

  Interpretation:
     p1, result : list

lookup_player

  Function: lookup player (p1)

  Evaluates p1.

  Parses ( completes ) the items in the p1 list to player
  and monster names. If the completion of an item fails that
  item is removed from the result list.

  Interpretation:
     p1, result : list

lookup_object

  Function: lookup object (p1)

  Evaluates p1.

  Parses ( completes ) the items in the list p1 to object names.
  If the completion of an item fails that item is removed from 
  the result list.

  Interpretation:
     p1, result : list

parse_player

  Function: parse player (p1)

  Evaluates p1.

  The function offers an equivalent parameter interpretation 
  service as used in those monster functions where wild cards 
  are allowed.

  Return a list of players and monsters. The list is equivalent to
  parameter p1. ( whatever that implies, then )

  Errors:
    - p1 is empty
    or
    - an error occurs while interpreting p1
    => the result is an empty string

  Interpretation:
      p1     : string
      result : list

parse_object

  Function: parse object (p1)
                   
  Evaluates p1.

  Offers an equivalent parameter interpretation service as
  is used in those monster functions where wild cards are
  allowed.

  Returns a list of objects equivalent to p1.

  Errors:
    - p1 is empty 
    or
    - there is an error while interpreting p1
    => the result is an empty string/list

  Interpretation:
      p1     : string
      result : list

parse_room

  Function: parse room (p1)

  Evaluates p1.

  The function offers an equivalent parameter interpretation service
  as used in those monster functions where wild cards are allowed.

  Returns a list of rooms equivalent to p1.

  Errors:
    - p1 is empty
    or
    - An error occurs while interpreting p1
    => the result is an empty string

  Interpretation:
      p1     : string
      result : list

privilege

  Function: privilege (p1,p2)

  Evaluates p1 and p2.

  All the player ( or monster ) p1 privileges found in the
  list p2 are returned. Possible privileges are : wizard,
  manager, experience, quota, object, poof, special and
  monster. The "wizard" privilege means that the player is
  the Monster Manager.

  Errors:
	- p1 is not a player or monster name
          => the result is an empty string/list
        - p2 has a non-existent privilege
          => the privilege is excluded from the 
             result list

  Interpretation:
     p1     : name
     p2     : list
     result :  list

userid

  Function: userid (p1)

  Evaluates p1.

  The function requires the "experience" privilege from the
  monster.

  Returns a list where the player names in p1 have been 
  substituted for their respective userids.

  Errors:
        - the code is not monster code or the monster does not
          have the "experience" privilege
          => the function does not evaluate p1; an empty string
          is returned
	- an invalid player ( monster ) name is found
	  => the respective userid is excluded from the result
	- a monster name is found
	  => is included, the userid uses internal format

  Interpretation:
      p1, result : list

attack

  Function: attack (p1)

  Evaluates p1.

  Substracts p1 units from the player ( who triggered the
  action ) health. However, the monster experience dictates
  the maximum damage allowed ( p1 can be greater than what
  is allowed in which case p1 is decreased ). The total sum
  of subsequent attacks may not exceed the maximum damage 
  allowed.

  Returns the attack strength.

  Requirements:
     - Monster cannot have attacked to its limit already.
     - Player must not be protected
     - Hooks must be in the "privileged" mode

  Errors:
     - The monster has already attacked to its limit
       or
     - The player is protected
       or
     - p1 is not a number
       or
     - the code is not monster code and the "privileged" 
       mode is off
       => no action; an empty string/number is returned
     - p1 is greater than the maximum attack strength
       allowed
       => The attack strength is the maximum allowed
       ( it is also returned )
     - the code is not monster code and privileged mode
       is on
       => no limits in attack strength
 
  Interpretation:
     p1, result : number

  N.B:
     - The function does not tell how the attack succeeded
     ( can be found out be the function "health" )
     - The function does not require monsters to be
     in the "privileged" mode anymore

spell_level

  Function: spell level()

  Returns the user's experience level of a spell. Can only be used
  while executing spell code ( labels summon and learn ).

  Errors:
         - As in other spell functions
           => an empty string is returned

  Interpretation:
     result : number

  N.B:
 	 - The spell user ( in the variable "summoner name" )
           is different from the user executing the code
	   ( exception: the label "learn" )

set_spell_level

  Function: set spell level(p1)
 
  Evaluates p1.

  Sets the spell user's experience level ( of a spell ). 
  Can only be used when executing spell code ( the labels
  "summon" and "learn" ). 
    Level 0           - the player does not know the spell
    a positive number - the player knows the spell

  Returns the new experience level.

  Errors:
         - As in other spell functions
         or
	 - p1 is not a number
         or
	 - p1 < 0
          =>an empty string/number is returned

  Interpretation:
     p1 , result : number

  N.B:
 	 - The spell user ( in the variable "summoner name" )
           is different from the user executing the code
	   ( exception: the label "learn" )
	 - This function is for teaching spells to players
           ( in the label "learn" )
	 - The variable "book name" has the name of the book
           ( magic book ) that triggered the label "learn" of
           the spell

Fixing_Database

  Start monster with MONSTER/FIX -command.

  The fixing subsystem uses file level locks to prevent other 
  players from playing Monster while you are fixing the database.

  If someone is playing, and you want to fix the database, 
  it's better to shut Monster down with the  command "D" in 
  the subsystem menu (in system-menu).
  

Additional information available:

Menu Partial_rebuild Fix_commands
  By typing "?" you get the following menu in /FIX -system:

  A        Clear/create privileges database.
  B        Clear/create health database.
  C        Create event file.
  D        Reallocate describtins
  E        (Exit subsystem) Start monster playing.
  F        Clear/create experience database.
  G        Calculate objects' number in existence.
  GL       Clear/create global database.
  GS       Mark moster shutdown to global database.
  GU       Mark monster active to global database.
  GV       Show global database.
  G-       Mark monster database as invalid.
  G+       Mark monster database as valid.
  H        This list
  I        Repair index file.
  J        Repair paths.
  K        Reallocate MDL codes.
  L        Repair monsters' location.
  M        Clear/create MDL database.
  N        Clear/create and recount quota database.
  O        Clear/create object database.
  OW       Check owners of objects, rooms and monsters.
  P        Clear/create player database.
  Q        (Quit) Leave monster.
  R        Clear/create room database.
  S        Clear/create password database.
  SP       Clear/create spell database.
  V        View database capacity.
  ?        This list

Partial_rebuild

  The following commands make partial rebuild of the Monster database.  After 
  these command use the fixing commands to fix pointers in the database.

  A        Clear/create privileges database.
  B        Clear/create health database.
  C        Create event file.
  F        Clear/create experience database.
  M        Clear/create MDL database.
  N        Clear/create and recount quota database.
  O        Clear/create object database.
  P        Clear/create player database.
  GL       Clear/create global database.
  R        Clear/create room database.
  S        Clear/create password database.
  SP       Clear/create spell database.

  Recommended order: GL R O P M C F N S SP

  You can use only one of these: R, O and P.  Should you need more, use 
  /REBUILD  instead.

Fix_commands

  The following commands can fix small errors in the database without disaster:

  C        Create event file.
  D        Reallocate descriptions
  G        Calculate objects' number in existence.
  I        Repair index file.
  J        Repair paths.
  K        Reallocate MDL codes.
  L        Repair monsters' location.
  N        Clear/create and recount quota database.
  OW       Check owners of objects, rooms and monsters.

  Recommended order: C I N G J K L D OW