This is the NOTES file for TinyMUSH 2.0.

Changes from TinyMUSH 1.0:
-------------------------

This section lists the commands, attributes, and flags that are different
between TinyMUSH version 1 (as described in Croaker's MUSH Manual) and
TinyMUSH 2.0.  There are *many* new commands for both players and wizards,
several new flags and functions, and a few new attributes.  With the additon
of a runtime configuration file, the game becomes much more configurable,
eliminating in most cases the need to recompile in order to change command
costs, permissions, and other global parameters.

Players
   New Commands
      @decompile <thing>
         Outputs the sequence of commands needed to re-create <thing>.
      @doing <text>
         Sets your doing string that appears in the WHO report.
      @dolist <list>=<command-list>
         Executes <command-list> once for each item in the space-separated
         <list>, substituting the characters ## for the item from <list>.
      @drain <object>
         Removes any commands waiting on <object> as a semaphore without
         executing them.
      @emit <text>
         Sends <text> to everyone in the current room withoug prefixing
         your character name.
      @femit <object>=<text>
         Forces <object> to emit <text>, regardless of the setting of INHERIT
         bits.
      @fpose <object>=<text>
         Forces <object> to pose <text>, regardless of the setting of INHERIT
         bits.
      @fsay <object>=<text>
         Forces <object> to say <text>, regardless of the setting of INHERIT 
         bits.
      @last <player>
         Tells the time and hostname of your last few connections to the game,
         as well as info about recent failed connect attempts.
      @list <arg>
         Lists information from the internal tables of the MUSH.  If entered
         without arguments, tells you the things you can list.
           attributes    - Predefined attributes.
           commands      - Built-in commands.
           costs         - How much various commands and actions cost.
           default_flags - The flags new objects get created with.
           flags         - The flags an object can have.
           functions     - Built-in functions, like ADD() or NEXT().
           options       - Various internal options and limits.
           switches      - Command switches available on predefined commands.
      @listmotd
          Displays the message-of-the-day again.
      @mvattr <object>=<from>,<to1>[,<to2>]...
          Copies an attribute to one or more new attributes on the same object,
          and then deletes the original attribute.
      @notify <object> [= <count>]
          Runs the first <count> commands that are waiting on <object> as a 
          semaphore (default 1).
      @oemit <player> = <message>
          Emits <message> to everyone in the current room except for <thing>.
      @pemit <player> = <message>
          Emits <message> just to <player>.
      use <object>
          Triggers the USE, OUSE, and AUSE attributes on <object>.
      version
          Displays the version of MUSH currently running, along with when
          it was built.
      LOGOUT
          Disconnect from your character without breaking the net connection.
          You may the log back in as yourself or someone else.
      SESSION
          Tells you how many characters you have sent and received from the
          MUSH.
   Changes to Existing Commands
      @chown <obj>[/<attrib>] [=<who>]
         You can now @chown things to 'me', as well as leave off the <who>
         entirely (in which case it defaults to the player doing the @chown).
         You may also @chown attributes of objects (to yourself if you own
         the object, and to the owner of the object if you own the attribute
         but not the object.
      @clone
         It is possible to clone VISUAL objects owned by others.
         The object number of the new object is reported.
         /inherit switch to retain an INHERIT bit on the new object.
      @create
         The object number of the new object is reported.
      @dig
         You can create a link back to your current room (if it is LINK_OK)
         Syntax: @dig <name>=<out-exitlist>,<back-exitlist>
      @edit
         If '^' is specified as the 'from' string, then the 'to' string is
         added to the beginning of the attribute.  If '$' is specified as the
         'from' string, the 'to' string is added to the end.
         You can specify a wildcarded attribute name, and @edit will apply
         the changes to every attribute that matches.
      @entrances <object>
         You can specify the object to check.  The command also gives a little
         more information about other objects that link to the object being
         checked.
      @halt <object>
         You can now halt specific objects.
      @lock <object>/<attrib>
         Locks <attrib> on <object>, so that it doesn't change ownership when
         the object is @chowned.  Locked attributes are also not checked for
         $-commands.
      @open <direction-list> [= <room>[, <return-directionlist>]]
         If <return-directionlist> is specified, make an exit back to the
         original room if possible.
      @ps[/<switches>] [<object>]
         Lists commands on the queue for everything you own, or for just
         <object>.  @ps/long also displays the enactor and the arguments,
         @ps/summary just displays a count of the number of commands in the
         queue.
      @search [<player>] [<key>=<value>]
         New key: eval.  This key evaluates <value> for each object, replacing
         ## with the object being checked.  Objects that cause true (nonzero)
         evaluations are listed.
      @set <object>=<attr>:<value>
         If <attr> does not exist, it is created as a user-named attribute.
      @set <object>/<attr>=[!]no_command
         Enables or disables checking for $-commands on <object>'s <attr>.
      @sweep
         Now lists whether objects are listening or looking for commands.
         DIsplays more detailed information about what objects are listening
         for which events.
         New switches to only check for objects listenening for certain
         events: /commands /connected /listeners /players.
         New switches for selecting where to @sweep: /here /inventory
      @switch[/<switches>] <target> = <val1>,<cmd1>[,<val2>,<cmd2>]...[,<dflt>]
         New switch /first: causes only the first match to be executed,
         instead of all matches.
      @unlock <object>/<attrib>
         Unlocks <attrib> on <object>, so that it will change ownership when
         the object is @chowned.  Also allows the attribute to be checked for
         $-commands, except if you don't own the object.
      @wait <object>[/<secs>] = <command>
         Waits on <object> as a semaphore.  <command> will not be executed
         until <object> has been notified with a @notify command.
         If <secs> is specified, the command will be run when <object> is
         notified or after <secs> seconds pass, whichever comes first.
      examine <object>[/<attribute>]
         If yoy specify the optional attribute, only attributes whose names
         match (after processing wildcards) are listed.
      WHO <prefix>
         If <prefix> is specified, only players who match it are listed.
         WHO also displays the doing string for connected players.
   New Flags
      unfindable(U)
         Prevents players from being located by @whereis or the loc() funciton.
      jump_ok(J)
         Indicates that anyone may @tel there.  LINK_OK and ABODEused to
         control this functionality.
      halted(h)
         If set, the object may not run commands or have attributes triggered.
      quiet(Q)
         Prevents 'Set.', 'Triggered.', etc. messages from appearing.
      visual(V)
         Lets anyone examine the object and see all of its attributes.
      verbose(v)
         Tells you every command that the object runs as it runs.
      nospoof(N)
         Tells you who really is saying/posing/emitting things.
      transparent(t)
         If set on an exit, shows you the description of what is on the other
         side when you look at it.
      inherit(i)
         Lets the object @force you and your other INHERIT objects.  If set on
         a player, makes all of that player's objects operate as if they were
         set INHERIT.
   Changes to existing flags
      haven(H)
         No longer prevents commands from running.
      abode(A)
         No longer gives the right to @teleport in.
      link_ok(L)
         No longer gives the right to @teleport in.
   New Functions
      AFTER(s1, s2)
         Return portion of s1 that follows s2.
      AND(x, y)
         AND two logical values.
      BEFORE(s1, s2)
         Return portion of s1 that comes before s2.
      CAPSTR(str)
         Capitalize the first letter.
      CAT(s1, s2)
         Concatenate two strings.
      COMP(s1, s2)
         Case-sensitive string compare.
      DELETE(str, startchar, len)
         Remove characters from string.
      DIST2D(x1, y1, x2, y2)
         Distance in two dimensions.
      DIST3D(x1, y1, z1,x2, y2, z2)
         Distance in three dimensions.
      ELOCK(lockobj, checkobj)
         Does checkobj pass the lock on lockobj?
      ESCAPE(str)
         Insert a \ before characters the parser treats specially.
      EQ(n1, n2)
         Numeric equality test.
      FLAGS(obj)
         List of flags set on obj.
      GT(n1, n2)
         Numeric greater than test.
      GTE(n1, n2)
         Numeric greater than or equal test.
      HASFLAG(obj, flag)
         Does object have flag set?
      LATTR(obj)
         List of attributes for obj.
      LCON(obj)
         Contents list for obj.
      LCSTR(str)
         Convert to lowercase.
      LNUM(count)
         Generate a list of numbers from 0 to count-1.
      LOCK(obj)
         Text of lock for obj.
      LT(n1, n2)
         Numeric less than test.
      LTE(n1, n2)
         Numeric less than or equal test.
      LWHO()
         List of logged-in users.
      MONEY(obj)
         Value of obj.
      MUDNAME()
         Return the name of the mud.
      NEARBY(obj1, obj2)
         Are they near each other?
      NEQ(n1, n2)
         Numeric not equals test.
      NOT(n1)
         Logical NOT.
      OBJ(obj)
         Objective pronoun for obj.
      OR(n1, n2)
         Logical OR.
      POSS(obj)
         Posessive pronoun for obj.
      REVERSE(str)
         Reverses the characters in str.
      REVWORDS(str)
         Reverses the order of the words in str.
      ROOM(obj)
         Return the outermost room that obj is in (not any intermediate
         containing objects or players).
      SECS()
         Seconds since 00:00 1/1/1970
      SECURE(str)
         Remove characters that the parser treats specially.
      STARTTIME()
         ASCII time that the MUSH was started.
      SUBJ(obj)
         Subjective pronoun for obj.
      TYPE(obj)
         Type of object (ie player, room, exit, thing)
      UCSTR(str)
         Convert to uppercase
      VERSION()
         Version of MUSH that is running.
      WORDPOS(string, pos)
         Which word is character pos in?
      XOR(n1, n2)
         Logical XOR.
   New and Changed Attributes
      aconnect
         Run when you connect.
      adisconnect
         Run when you disconnect.  %0 is the reason for disconnect.
      aenter, enter, oenter
         Run in a place right after someone enters it.
      oxenter
         Message sent to others in the place the arriving object has left.
      aleave, leave, oleave
         Run in a place right before someone leaves it.
      oxleave
         Message sent to others in the place the leaving object goes.
      alias
         Another name for the object.  Right now, just a comment.
      amove, move, omove
         Run on the moving object right after it moves
      ause, use, ouse
         Triggered when someone 'use's the object.

Wizards
   New Commands
      @apply_marked <command>
         Run command for each marked object
      @chownall <old> = <new>
         @chown all objects owned by <old> to <new>.
      @disable <flag>
         Turns off internal flags, such as logins, building, command queueing.
      @enable <flag>
         Turns on internal flags, such as logins, building, command queueing.
      @kick <count>
         Immediately run <count> commands from the player queue.
      @list <choice>
         Lists all kinds of neat and useful (sometimes only for debugging)
         stuff.
      @list_file <file>
         List one of the standard message files.
      @listmotd
         Lists messages-of-the-day.
      @mark[/<switches>] [<player>] <type>=<value>
         Same syntax as @search, except it sets or clears the marked bit of
         selected objects.
      @mark_all[/<switches>]
         Set or clear the mark bits on all objects.
      @motd[/<switch>] <message>
         Sets one of the messages-of-the-day.
      @note <message>
         Makes a note in the log.
      @readcache
         Rereads changed text files and indexes into memory.
      @timewarp[/<switch>]
         Warps time for the wait queue and/or periodic events such as database
         dumping, RWHO data updating, etc.
      slay <obj>
         Kill <obj> without paying insurance.
      wizhelp
         Display help on wizard commands and topics.
      DOING
         Shows WHO output as the players see it.  (including @doing info)
      SESSION
         Displays the number of characters connected players have sent and
         had sent to them.  Useful for finding network problems.
   Changes to Existing Commands
      @chown[/<switches>] <object>
         /preserve switch for preserving the original owner in the clone.
      @ps[/<switches>] <object>
         By default you see your own queue.  Use /all to see the entire queue.
      @toad <victim> [=<recipient>]
         You can now specify who gets ownership of the victim's (halted)
         objects.
      @wall[/<switches>] <message>
         Several new switches that do useful things.
      @wizwall
         Renamed to @wall/wiz
      WHO
         Shows players' current location, number of commands typed, and
         host from which they connected.
   New Flags
      gagged(g)
         Prevents the player from saying, emoting, etc.
      slave(s)
         Prevents the player from doing things that would change the database.
      marked(m)
         A temporary flag used by @mark, @mark_all, and @apply_marked.
      suspect(u)
         Notify connected wizards when this player connects, disconnects,
         or does any of a few other interesting things.
      immortal(i)
         Prevents the object from being killed.
   New Attributes
      allowance
         Sets a daily allowance different from the default.
      comment
         A player-invisible attribute intended for notes about the player.
      timeout
         Idle timeout for the player if different from the default.

Game Maintainers
   New Commands
      @admin <directive> = <value>
         Change configuration directive at runtime.
      @attribute[/<switch>] <attr> [= <value>]
         Change access to, rename, or delete user-named attributes.
      @fixdb[/<switch>] <obj> = <value>
         Manually repair damage to database.
      @rwho[/<switch>]
         Starts or stops RWHO information transmission.

General:
  The parser has been rewritten to close some security holes and fix some
  long-outstanding bugs.  As a result, some things that worked before will
  not work any more, but most of these 'features' were not documented in the
  MUSH manual.

     - Delimiter nesting is both more reliable and stricter.  You now need to
       include a closing ) or ], previously you could sometimes get away with
       omitting them.
     - You can now nest uses of the [ and ] delimiters.
     - The \ character is the escape character, and it can be used to escape
       characters treated specially by the parser, such as delimiters and
       the comma character.  To get a single \ in a string, use \\.
     - The construct '$exec *:%0' does not work any more.  Use something like
       '$exec *:@force me=%0' instead.  Note that this gives anyone near
       the object access to your objects and is poor programming practice.
     - Note that the { and } delimiters do not defer evaluation, but are used
       to group commands and arguments together, preventing a ; or , from
       ending the command or argument.
       
   Players may define their own attributes on objects in addition to the
   predefined attributes.  These attributes are called user-named attributes.
   It is possible for #1 to globally change the access to particular user-named
   attributes that are to be used for special purposes (such as making Level or
   Hitpoints only settable by wizards on a mush with a built-in combat system).

   Attributes may be owned independently of objects.  By default the owner
   of an object owns all the attributes and the ownership of attributes changes
   when the object is @chowned, but individual attributes can be locked against
   the ownership change.  You can only change an attribute if you own both
   the attribute and the object it is stored on.

   Attribute locks have changed somewhat.  You can now lock against any
   attribute, and the object testing the lock and all of its contents are
   checked against the lock value, and the lock succeeds if any of the objects
   checked passes the lock.  In order for the lock to succeed, the locked
   object must have the same owner as the attribute (or the attribute must
   be a public attribute such as sex), and the value of the attribute must
   match the pattern set in the lock.

   Players can use objects they own as semaphores.  One use of semaphores
   is to implement mutual exclusion locks, so as to prevent a particular
   part of an object's code from being executed for more than one player at
   the same time.

   You can set up one room to contain global exits and $-commands that are
   available from anywhere on the MUSH.  This room is called the Master Room.
   This room should be owned by a wizard, set FLOATING, have no entrances
   (except perhaps one locked to current wizards), and not be JUMP_OK, LINK_OK,
   or ABODE.  A good idea to improve security further is to set the room
   INHERIT and have its AENTER check that the owner of the arriving object is
   a wizard, and if not @tel the object somewhere else.

   The LEAVE and ENTER family of attributes are now run whenever you leave
   or enter any location, not just an object.  Also, the MOVE family of
   attributes are run on you whenever you move from one place to another.

   Access to commands and attributes may be changed from the configuration
   file or with the @admin command.  Access to individual user-named attributes
   can be changed with the @attribute command.

Configuration Directives:
------------------------

This section lists all the configuration directives that may be included in
the .conf file that mush reads when it starts up.  Directives which affect
similar things are grouped together under one heading.  Most of these
directives can be set while the game is running by player #1 with the @admin
command, the ones that cannot are usually ones that are only used during
startup or those that contain names of files to be read from the system that
the mush is being run from.

Internal/debugging
   abort_on_bug - Abort on internal inconsistencies (not implemented)
   log - Specify types of events to log.
   log_options - Specify types of information to be included about players
      causing log messages.
   
Configuration control
   config_access - Change runtime access to configuration directives
   include - Read configuration directives from file

Compression control
   compress_program - Program to compress struct database if database
      compression is enabled
   compression - Should the struct database be compressed when written/
      uncompressed when read?
   internal_compress_string - Should the internal bigram-based string
      compression system be used?
   space_compress - Should multiple spaces be compressed to single spaces?
   uncompress_program - Program to uncompress struct database if database
      compression is enabled

Database files
   crash_database - Where a copy of the struct database gets written
      when the game panics (not implemented)
   gdbm_database - Name of the gdbm file to use.
   initial_size - Number of objects to allocate for the struct portion of
      the database when creating a new database.
   input_database - Read the struct database from this file
   output_database - Write the struct database to this file when dumping.

Database dumping
   dump_interval - Time between automatic database dumps.
   dump_message - Message sent to all connected users when a dump is
      performed.
   dump_offset - How long after startup is the first automatic dump
      performed?
   fork_dump - Should dumps be performed by a fork()'ed process?
   fork_vfork - Should the vfork() call be used instead of fork()?
   garbage_chunk - Garbage-collect this many objects each second (obsolete).
   gdbm_cache_size - Size of the gdbm cacke in kbytes.

Text files and Messages
   badsite_file - A file containing what someone who connects from a forbidden
      site sees
   connect_file - A file containing what someone sees when they open a
      connection from a site that doesn't enforce registration.
   connect_reg_file - A file containing what someone sees when they open a 
      connection from a site that does enforce registration.
   down_file - A file containing what someone sees when they try to login but
      fail because logins are disabled.
   down_motd_message - A wizard-settable messages that players see when they
      try to login but fail because logins are disabled.
   guest_file - File shown to people connecting to the guest character
      in place of the motd_file.
   help_file - The name of the file containing the help text.
   help_index - The name of the file containing the help index.
   motd_file - A file containing what players see right after they connect
      to their characters.
   motd_message - A wizard-settable message that players see right after the
      motd_file.
   news_file - The name of the file containing the news text.
   news_index - The name of the file containing the news index.
   newuser_file - A file containing information shown to players the first
      time they connect to their characters in place of motd_file.
   quit_file - File containing what you see when you QUIT.
   register_create_file - FIle containing what players see when they try to
      use the 'create' command from a site for which registration is enforced.
   wizard_help_file - The name of the file containing the wizard help text.
   wizard_help_index - The name of the file containing the wizard help index.
   wizard_motd_file - A file containing what wizards see when they connect to
      their characters.
   wizard_motd_message - A wizard-settable message that only wizards see when
      they connect to their characters.

Network control and monitoring
   command_quota_increment - Add this to connected players' command quota
      every timeslice
   command_quota_max - Don't increment command quota over this value
   check_interval - Interval between idle checks
   check_offset - When to perform first idle check
   conn_timeout - Allow players this long to connect before dropping
      net connection
   forbid_site - Disallow connects from a host, subnet, or network.
   hostnames - Does the wizard WHO report use hostnames instead of
      IP addresses when possible?
   idle_interval - How long between checks for idle users.
   idle_timeout - Players idle longer then this get the @boot.
   output_limit - The max number of characters a player may have queued for
      output.
   permit_site - Allow connections from this host or network, and allow new
      characters to be created with the 'create' command.
   port - Network port to listen on for new connections.
   register_site - Allow connections from this host or network, but don't allow
      new characters to be created with the 'create' command.
   retry_limit - Close the net connection after this many failed login
      attempts.
   suspect_site - Notify connected wizards of any connects and disconnects from
      this host or network.
   timeslice - How often does the command quota for connected players get
      updated?
   trust_site - Don't notify connected wizards of connects and disconnects from
      this host or network.  Undoes suspect_site.

Command queue management
   player_qeue_limit - How many commands may a player have in the queue at
      once?
   queue_active_chunk - Number of commands to run from the queue when there has
      been network activity.
   queue_idle_chunk - Number of commands to run from the queue when there has
      been no network activity.

Defining new commands and aliases
   alias - Create an alias for a command or command/switch combination
   attr_alias - Create an alias for a predefined attribute
   flag_alias - Define an alias for a flag name.
   logout_cmd_alias - Define an alias for a logged-out command.
   master_room - Room containing global default exits and $-commands.

Access to commands, switches, etc.
   access - Change access to commands and switches
   attr_access - Change access to an attribute
   attr_cmd_access - Change access to all attribute setting commands at once
   list_access - Change access to items under the @list command.
   logout_cmd_access - Change access to logged-out commands (like WHO, QUIT)
   power_access - Change access to powers/capabilities. (Not implemented)
   user_attr_access - Change default access for new user attributes.

Player limits/controls/capabilities
   guest_char_num - db number of the Guest char.  The Guest character
      is typically not allowed to do things like create objects or change
      his name or password.
   match_own_commands - Should objects other than players check themselves
      for $-commands?
   pemit_any_object - Can players @pemit to objects they don't own that are
      far away?
   pemit_far_players - Can players @pemit to players that aren't nearby?
   player_listen - Should @listen/@ahear be obeyed on players?
   player_match_own_commands - Do players check for $-commands on themselves?
   recycling - Is object destruction allowed.
   robot_speech - Are robot players allowed to speak in public areas?
   sweep_dark - Can players @sweep dark rooms they don't own?
   secure_homes - Should HOME be validated before using?

Default values
   default_home - Where objects go when they go home and the home location
      is invalid
   exit_flags - What flags are new exits created with?
   player_flags - What flags are new players created with?
   player_starting_home - What is HOME of new players set to?
   player_starting_room - Where do new players start out?
   robot_flags - What flags are new robots created with?
   room_flags - What flags are new rooms created with?
   switch_default_all - Does @switch perform all matches by default?
   thing_flags - What flags are new things created with?

Output formatting and options
   dark_sleepers - Are disconnected players dark?
   examine_flags - Does EXAMINE list flag names?
   examine_public_attrs - Does EXAMINE show public attributes by default?
   money_name_singluar - The name of one coin (ie. penny, zorkmid)
   money_name_plural - The name of many coins (ie. pennies, zorkmids)
   public_flags - Are the flags of an object readable by anyone with flags()?
   quiet_look - Does the look command also show attributes?
   quiet_whisper - Do others in the room notice you whispered something?
   read_remote_desc - Are the descriptions of distant objects readable with
      examine and get()?
   read_remote_name - Are the names of distant objects readable with 
      examine and name()?
   see_owned_dark - Do you see your own DARK objects when looking?
   whereis_notify - Does the target of a @whereis get told you did it?

Economics
   clone_copies_cost - Does @clone copy the cost of the cloned object?
   create_max_cost - The maximum cost that may be used to create an object.
      Using more wastes the excess.
   create_min_cost - The minimum cost that may be used to create an object.
   destroy_sacrifice - Does dropping an object in a temple @destroy it?
   dig_cost - How much does the @dig command cost?
   earn_limit - Earning more than this much money is difficult.
   find_money_chance - Players have a 1 in f_m_c chance of finding a penny
      each time they move.
   kill_guarantee_cost - Amount to spend on a kill command to guarantee
      success.
   kill_max_cost - Maximum amount that may be gainfully spent on a kill
      command.  Anything over this amount is wasted.
   kill_min_cost - Minimum amount that may be gainfully spent on a kill
      command.
   link_cost - Cost to make a link.
   machine_cmd_cost - 1 in m_c_c commands run by a machine cost one penny.
   open_cost - The cost to create a new exit.
   page_cost - The cost of the page command (and @pemits to faraway players).
   paycheck - Players get this much money each day they connect.
   robot_cost - The cost of making a robot with the @robot command.
   sacrifice_adjust - Adjustment to sacrifice value applied after dividing the
      cost by sacrifice_factor.
   sacrifice_factor - Divide the object's cost by this (before applying
      sacrifice_adjust) to determine its value.
   starting_money - How much money do new players start out with?
   wait_cost - Deposit required to put a command on the queue.

Building Quotas
   exit_quota - How much quota does it take to make an exit?
   player_quota - How much quota does it take to make a (robot) player.
   quotas - Are building quotas enforced and maintained?
   room_quota - How much quota does it take to dig a room.
   starting_quota - How much quota do new players start out with?
   thing_quota - How much quota does it take to create a thing?

RWHO information
   mud_name - The name of the MUD that is sent to the RWHO server as well
     as reported by the mudname() function.
   rwho_data_port - Port to read RWHO information from in response to a local
      RWHO command (if configured).
   rwho_dump_interval - How often to transmit RWHO information to the server.
   rwho_host - Host to send RWHO information to.
   rwho_info_port - Port to write RWHO information to.
   rwho_password - Password sent with RWHO data.
   rwho_transmit - Should we transmit RWHO data?
