& CHAT
& comsys
  CHAT SYSTEM

  The MUSH has a built-in chat system with many different channels.
  These channels vary from MUSH to MUSH; ask at your local site or
  use @channel/list to see which ones are available.

  You can talk to many people on the MUSH via the chat system, without
  needing to be in the same room as them. Use the "@channel" command
  to join, leave, or check who is on a channel, and use the "@chat"
  or "+" command to communicate.

  If you examine yourself, you will see a list of channels that you are
  currently listening to. Some channels are restricted to wizards or
  administrators only. See the following help topics for details:
    @chat, @channel, @cemit, @clock, cwho()

& +
& @chat
  @chat <channel> = <message>
  +<channel> <message>

  This tells everyone on <channel> your <message>. You can prepend
  <message> with ':' or ';' to pose instead of talk. This command can
  also be formatted:  +<channel> <message>
  You do not need to type the complete name of the channel, only as
  many letters as needed to make it distinct from another channel
  that you're also on.

  Note: if you use the '+' form of this command, and you do not
  use the name of a known channel, your command will be processed
  as normal, preventing user-defined commands like "+last" from
  being clobbered by the chat system.

  See also: chat
& @cemit
  @cemit[/noisy][/noeval] <channel>=<message>

  This command allows <message> to be directly broadcasted to the
  players on <channel>. No channel-prefix is prepended unless the
  /noisy switch is given. If the /noeval switch is given, the <message>
  is not evaluated. This command is intended for use in writing
  extended chat systems.

  See also: chat
& @channel
  @channel/list [<channel-prefix>]
  @channel/what [<channel-prefix>]
  @channel/on <channel>[=<player>]
  @channel/off <channel>[=<player>]

  The basic form of this command allows you to see the available
  channels, and join or leave a channel. You do not need to type the
  complete name of the channel, only as many letters as needed to make
  it distinct from other channels.

  Wizards may add and remove other players from channels by providing
  a player name as a second argument.

  Some channels may be restricted in who can join them and/or speak
  on them. If the Extended Chat System is enabled, @channel/list will
  show you the channel's name, number of users, number of message
  since last restart, access information, and your status. See
  "help channel-list" for an explanation of how to read the listing.
  @channel/what will show you the channel's name, access information,
  and a description of the channel's purpose.

  More details are provided in "help @channel2".  See also: chat
& @channel2
  @channel/who <channel>
  @channel/hide <channel> = <yes|no>
  @channel/title <channel> = <string>

  The @channel/who command shows you who is currently on a channel,
  if you are permitted to see it.

  Some channels allow their users to hide from the @channel/who list.
  If you're on such a channel and are permitted to hide, you can
  use @channel/hide <channel>=yes to hide yourself, and
  @channel/hide <channel>=no to reappear.

  @channel/title lets you set a title to appear before your name
  when you speak on the channel. If you leave the channel, your
  title is cleared; use @channel/gag instead (see help @channel3).

  See "help @channel3" for more.
& @channel3
  @channel/mute <channel> = <yes|no>
  @channel/gag <channel> = <yes|no>

  Some channels broadcast messages when players connect or disconnect
  from the MUSH. If you're on such a channel and don't want to hear
  those messages, use @channel/mute <channel>=yes. To resume hearing
  the messages, use @channel/mute <channel>=no. You can also use
  @channel/unmute <channel>.

  If you want to remain on a channel but not receive any messages
  on the channel, use @channel/gag <channel>=yes. To resume hearing,
  use @channel/gag <channel>=no (or @channel/ungag <channel>). If you
  disconnect, the channel will be automatically ungagged for you. If the
  channel does not have the "open" priv, you can not speak on it while
  you are gagged.

  If you do not specify a channel with these commands, you mute or
  gag (or unmute or ungag) all channels at once.

  See "help @channel4" for more.
& @channel4
  @channel/add <channel> [= <priv>]
  @channel/delete <channel>
  @channel/desc <channel> = <desc>
  @channel/rename <channel> = <new name>

  @channel/add creates a new channel. On some MUSHes, any player
  can create a new channel, though there will be a cost associated
  with creation (see @config chat). Possible <priv> specifications:
  * "player" - players may use the channel
  * "object" - objects may use the channel
  * "admin" - only royalty/wizards/chat_privs may use the channel
  * "wizard" - only wizards may use the channel
  * "quiet" - channel will not show connection messages
  * "open" - you may speak even if you aren't listening to the channel
  * "hide_ok" - you may hide from the channel who list.
  Specifications may be combined, space-separated. Default is "player"

  @channel/delete removes a channel. You must own it or be Wizard.
  @channel/desc sets the channel's description, shown on @channel/what.
    Descriptions are limited to 256 characters.
  @channel/rename is used to rename a channel.

  See "help @channel5" for more. See also "help @clock".
& @channel5
  @channel/priv <channel> = <new priv level>
  @channel/quiet <channel> = <yes | no>
  @channel/wipe <channel>
  @channel/decompile[/brief] <channel>
  @channel/chown <channel> = <new owner>

  The "priv" switch changes the channel's access privileges.
  The "quiet" switch turns the quiet status of a channel on and off.
  The "wipe" switch clears a channel of players without deleting it.

  The "decompile" and "chown" switches can only be used by Wizards.
  @channel/decompile produces a decompile of matching channels. If the
  /brief switch is included, players on the channel aren't listed.
  @channel/chown allows a Wizard to change the owner of a channel.

& channel-list
Here's the legend for reading the @channel/list output:

Channel Name               Num Users Num Msgs  Access Locks   Status
Sample                             1        0 [DPOWQHo jsmvh*] [On  QH]
                                               ||||||| ||||||   |   ||
Channel is DISABLED----------------------------/|||||| ||||||   |   ||
Channel allows PLAYERS--------------------------/||||| ||||||   |   ||
Channel allows OBJECTS---------------------------/|||| ||||||   |   ||
Channel is Wizard-only (W) or Admin-only (A)------/||| ||||||   |   ||
Channel is QUIET-----------------------------------/|| ||||||   |   ||
Channel is HIDE_OK----------------------------------/| ||||||   |   ||
Channel is OPEN (non-members can speak on it)--------/ ||||||   |   ||
Channel has @clock/join set----------------------------||||||   |   ||
Channel has @clock/speak set----------------------------/||||   |   ||
Channel has @clock/mod set-------------------------------/|||   |   ||
Channel has @clock/see set--------------------------------/||   |   ||
Channel has @clock/hide set--------------------------------/|   |   ||
Player is the owner of the channel--------------------------/   |   ||
Player is currently on/off/gagging the channel------------------/   ||
If on, player has the channel muted---------------------------------/|
If on, player is hiding on the channel-------------------------------/

& @clock
  @clock/join <channel> [= <key>]
  @clock/speak <channel> [= <key>]
  @clock/see <channel> [= <key>]
  @clock/hide <channel> [= <key>]
  @clock/mod <channel> [= <key>]

  The @clock command modifies the a lock on a chat channel if the
  extended chat system is in use. If no key is specified, the
  lock is unlocked. Evaluation locks will not work with @clock. 
  See help @clock2 for information on using indirect locks.

  The "join" lock restricts who can join the channel.
  The "speak" lock restricts who can speak to the channel.
  The "see" lock restricts who can see the channel on @channel/list
  The "hide" lock restricts @channel/hide if the channel is hide_ok.
  The "mod" lock restricts who can modify the channel. If you pass the
  mod lock on the channel, you can do anything short of deleting it.

  When new channels are added, the mod lock is set to the creator/owner,
  and all other locks are unlocked.

  See help @clock2 for how to use indirect locks to lock a channel to
  anything.

& @clock2
If user-defined locks are available, you can use indirect @clocks
to lock a channel to a lock of any type (including evaluation locks)
on a VISUAL object. This channel can only be joined by an UNFINDABLE player:

  >@clock/join unfindchannel=@#10
  >@lock/user:ChanJoinLock #10=isunfind/1
  >&isunfind #10=[hasflag(%#,unfindable)]
  >@set #10 = VISUAL

@clock                  Corresponding default user: lock for object
join                    ChanJoinLock
speak                   ChanSpeakLock
see                     ChanSeeLock
hide                    ChanHideLock
mod                     ChanModLock

You can lock multiple channels to the same object by specfiying a
specific indirect lock instead of the default one:

  >@clock/join onechannel=@#10/onechanneljoin
  >@clock/join anotherchannel=@#10/anotherchanneljoin
  >@lock/user:onechanneljoin #10 = 1
  >@lock/user:anotherchanneljoin #10 = isunfind/1
& COMMANDS
Help is available for the following MUSH commands:
 
  ahelp          anews          brief          DOING          drop
  examine        enter          events         follow         get            
  give           go             index          kill           leave          
  LOGOUT         look           move           news           page           
  pose           QUIT           read           rules          say
  score          slay           take           teach          think          
  unfollow       use            whisper        WHO            with
  "              :              ;              +
 
  In addition to these, there are several types of '@' commands. @-commands 
  are usually commands which have permanent effects on the MUSH (such as
  creating a new object). Here are the help topics on @-commands:
 
  @-ATTRIBUTES   @-BUILDING     @-GENERAL      @-WIZARD
 
& @-ATTRIBUTES
These '@' commands set standard message/action sets on objects. Each comes
in 3 versions: @<whatever>, @o<whatever>, and @a<whatever>. Only the
@<whatever> version is listed below, but help is available for each:
 
  @death         @describe      @drop          @efail         @enter
  @failure       @follow        @give          @idescribe     @leave
  @lfail         @move          @payment       @receive       @success
  @tport         @ufail         @unfollow      @use           @zenter        
  @zleave

These '@' command set other standard attributes on objects that don't
follow the pattern above:

  @aahear        @aclone        @aconnect      @adisconnect   @amhear
  @away          @charges       @cost          @conformat     @ealias        
  @exitformat    @filter        @forwardlist   @haven         @idle
  @infilter      @inprefix      @lalias        @listen        @nameformat
  @oxenter       @oxleave       @oxmove        @oxtport       @prefix
  @runout        @sex           @startup       

See also: ATTRIBUTES, NON-STANDARD ATTRIBUTES
& @-BUILDING
These '@' commands are building-related (they create or modify objects):
 
  @atrlock       @atrchown      @chown         @chzone        @clone         
  @cpattr        @create        @destroy       @dig           @elock         
  @eunlock       @firstexit     @link          @lock          @mvattr        
  @name          @nuke          @open          @parent        @recycle       
  @set           @undestroy     @ulock         @unlink        @unlock        
  @uunlock       @wipe
  
& @-GENERAL
These '@' commands are general utility and programming commands:

  @@             @alias         @break         @channel       @chat
  @cemit         @command       @config        @decompile     @doing
  @dolist        @drain         @edit          @emit          @entrances
  @find          @force         @function      @gedit         @grep
  @halt          @lemit         @listmotd      @mail          @map
  @notify        @nspemit       @oemit         @password      @pemit
  @ps            @remit         @restart       @rwall         @rwallemit
  @rwallpose     @scan          @search        @select        @stats
  @sweep         @switch        @teleport      @trigger       @verb
  @version       @wait          @whereis       @zemit

& @-WIZARD
These '@' commands are only usable by wizards or privileged players:
 
  @allhalt       @allquota      @boot          @chownall      @chzoneall
  @comment       @dbck          @disable       @dump          @enable
  @hide          @hook          @kick          @log           @motd
  @newpassword   @pcreate       @poll          @poor          @power
  @purge         @quota         @readcache     @rejectmotd    @shutdown
  @sitelock      @squota        @uptime        @wall
  @wallemit      @wallpose      @wizemit       @wizmotd       @wizpose
  @wizwall       cd             ch             cv
 
& @@
 
  The "@@" command is a special kind of command; it signals the start
  of a comment. The comment lasts until a semi-colon is found, just
  like other MUSH programming statements terminate with a semi-colon.
  It cannot be put into the middle of a statement, like
  @va me = $testing:@emit Test. @@ Just a test @@; @vb me=Testing.
  That will result in the object emitting "Test. @@ Just a test. @@"
  The correct usage is to make the comment a statement by itself:
  @va me = $testing:@emit Test.; @@ Just a test @@; @vb me=Testing.
 
  It is not necessary to use a closing '@@', but doing so makes the
  comment stand out much more clearly. A space between the first
  '@@' and the word following it is necessary.
& @aahear
  @aahear <object> = <action list>

  An aahear on an object is activated whenever the object's listen pattern 
  is matched by anything done/said by either anything else in the room OR 
  the object itself. In contrast, an ahear on an object cannot be activated 
  by anything the object itself does.

See also: @listen, @ahear, @amhear, LISTENING
& @aclone
  @aclone <object> = <action list>

  Sets the actions to be taken whenever <object> is @cloned. This command 
  can be useful for notifying the owner of a vending machine or parent 
  object when someone uses the machine.

  Please note that there is no @oclone, and that @clone is always a
  command, not an attribute.

See also: @clone, @create, ACTION LISTS
& @aconnect
  @aconnect <object> = <action list>

  Sets the actions to be taken by a player right after connecting to
  the game.

  Example: @aconnect me = :stretches luxuriously, as if waking from a nap.

  Note that long and spammy @aconnect messages, whether in your room or
  on a channel, are frequently found annoying by other players.

  The player's location, and zone object/objects in the zone parent
  room of the location, as well as objects in the master room, are
  also checked for an @aconnect. If one is found, it will be executed
  when a player connects in that location or zone (or, in the case of
  the master room, anywhere).

See also: @adisconnect, ACTION LISTS
& @adeath
  @adeath <object> = <action list>

  Sets the actions to be taken after <object> is killed. 
 
See also: @odeath, @death, kill, BEING KILLED, ACTION LISTS
& @adescribe
  @adescribe <object> = <action list>
  
  Sets the actions to be taken when  <object> is looked at. 
  A common use of this command is:

    @adesc me=think %N just looked at you.

  which will inform you whenever someone looks at you. %N will be 
  replaced by the name of the person who looked. While it is possible to
  set a message to be broadcasted to everyone in the area when someone
  looks at you, this is strongly discouraged, as many people find it 
  annoying.

See also: @describe, @aidescribe, look, SUBSTITUTION, ACTION LISTS
& @adestroy
  @adestroy <object> = <action list>

  Sets the actions to be taken by the object when it is destroyed
  (via @rec or @nuke). This can only be set by a Wizard.
  If @adestroy doesn't work, try &adestroy. :)
& @adisconnect
  @adisconnect <object> = <action list>

  Sets the actions to be taken by a player right after disconnecting
  from the game.

  Example: @adisconnect me = home

  The player's location, and zone object/objects in the zone parent
  room of the location, as well as objects in the master room, are
  checked for an @adisconnect. If one is found, it will be executed
  when a player disconnects in that location or zone (or, in the case of
  the master room, anywhere).

See also: @aconnect, ACTION LISTS
& @adrop
  @adrop <object> = <action list>

  Sets the actions to be taken when <object> is dropped. 
  If <object> is an exit, sets an action to be done after a player
  has passed through the exit.

See also: @odrop, @drop, drop, ACTION LISTS
& @aefail
  @aefail <object> = <action list>

  Sets the actions to be taken by the object when someone fails to enter
  it.

See also: enter, FAILURE, ACTION LISTS
& @aenter
  @aenter <object> = <action list>

  Sets the actions taken by the object whenever someone enters it.

See also: @enter, @oenter, enter, ACTION LISTS
& @aufail
& @oufail
& @ufail
  @ufail <object> = <message>
  @oufail <object> = <message>
  @aufail <object> = <action>

  Sets message shown to a player who fails to use an object via
  the 'use' command (@ufail), message shown to others in the room
  (@oufail), and action for the object to take (@aufail).

  Note that these attributes are @ufail, NOT @ufailure, for
  TinyMUSH compatibility.

& @afailure
  @afailure <object> = <action list>

  Sets the actions to be taken on failure to pass the @lock on an
  object. For players and things, this means failure to pick them up
  with get/take. For exits, this means failure to go through an exit.
  
  May be abbreviated @afail. 

See also: @fail, @ofail, get, EXITS, @lock, ACTION LISTS
& @afollow
  @afollow <object> = <action list>

  Sets the actions to be taken after someone or something begins 
  following the object. 

See also: follow, unfollow, followers(), @follow, @ofollow, ACTION LISTS
& @aunfollow
  @aunfollow <object> = <action list>

  Sets the actions to be taken after someone or something stops 
  following the object. 

See also: follow, unfollow, followers(), @unfollow, @ounfollow, ACTION LISTS
& @ahear
  @ahear <object> = <actions>

  Sets the actions to be taken after the object's @listen is matched. 
  Note that @ahear ignores any messages that the object itself creates, 
  so it can only be triggered by other things. If you want the object to
  be able to trigger itself, try using @amhear or @aahear.
  
See also: @aahear, @amhear, @listen, ACTION LISTS, LISTENING
& @aleave
  @aleave <object> = <action list>

  Sets the actions to be taken whenever someone leaves the object.

See also: leave, @leave, @oleave, ACTION LISTS
& @alfail
  @alfail <object> = <action list>

  Sets the actions to be taken whenever someone tries to leave the 
  object and fails (because the object is set NO_LEAVE or because
  the person fails the @lock/leave on the object). 

See also: leave, @lfail, @olfail, ACTION LISTS
& @alias
  @alias <player>=<alias>
 
  @alias is a special attribute. When a player sets an @alias, he is
  effectively giving himself a secondary name; he can be paged by his
  @alias, and matched with *<alias>, and all other game functions which
  look up player names will also accept the alias. The attribute is
  visible to all players.
  
  Aliases cannot be longer than the limit allowed for player names, 
  cannot contain spaces, and must be unique -- no other player may
  have the same alias or name as any other player's alias or name.

  @alias has no effect on non-players.
& @allhalt
  @allhalt

  This command halts all objects in the game in an effort to free up 
  the queue. Wizard-only command.
  
  This command is equivalent to "@halt/all".

See also: QUEUE, @ps
& @allquota
  @allquota[/quiet] [<limit>]

  This is a God level command that is only available if the quota
  system is being used.  It displays the current max and owned objects
  of every player (unless the /quiet switch is used) and resets their 
  quota left to the new limit minus the current number owned if a limit 
  is given.
& @amhear
  @amhear <object> = <action list>

  Sets the actions to be taken whenever the @listen on the object is
  matched by something that the object itself does. It will not react
  if anyone else in the area does anything that matches the @listen
  pattern. If you want other objects to be able to set off the action
  list, try using @ahear or @aahear.

See also: @listen, @ahear, @aahear, LISTENING, ACTION LISTS
& @amove
  @amove <object> = <action list>

  This is the action to be taken whenever an object moves.

See also: @move, @omove, @oxmove, ACTION LISTS, go
& @apayment
  @apayment <object> = <action list>

  Sets the actions to be taken after a player gives an object some
  amount of pennies. 

See also: give, @pay, @opay, @cost, MONEY, ACTION LISTS
& @atport
  @atport <object>=<action list>

  Sets the list of actions that <object> will perform when it is
  teleported. These actions are done after <object> has arrived
  in its new location.

See also: @tel, ACTION LISTS
& @atrchown
  @atrchown <object>/<attribute> = <new_owner>.
  Like @chown except it changes the control of an attribute from one person
  to another. You may only @atrchown attributes that you can normally set,
  and unless you're a wizard, you can only @atrchown attributes to yourself.

See also: @atrlock, ATTRIBUTES, NON-STANDARD ATTRIBUTES
& @atrlock
  @atrlock <object>/<attribute> = [on|off].

  If 'on' is specified, it 'locks' the specified attribute on the object.
  If the attribute is owned by someone other than you, you will gain
  ownership of it.  If an attribute is unlocked, then anyone who controls
  the object may change it.  If it is locked, only wizards and the attribute's
  owner (Assuming the owner controls the object) can change it. Wizards may
  lock/unlock anyones attributes.  If you specify 'off' it will unlock a
  locked attribute. Specifying neither will return the current value of the
  lock. You can only lock or unlock attributes you can normally set.

See also: @atrchown, ATTRIBUTES, NON-STANDARD ATTRIBUTES
& @asuccess
  @asuccess <object> = <action list>

  Sets the actions to be taken when the @lock of an object is passed.
  For things/players, this means picking them up. For exits, this means
  going through them. 

See also: @success, @osuccess, get, @lock, EXITS, ACTION LISTS
& @attribute
  @attribute <attrib>
  @attribute/access[/retroactive] <attrib> = <flag list>
  @attribute/delete <attrib>
  @attribute/rename <attrib> = <new name>

  @attribute is a wizard-only command which modify's the MUSH's
  table of standard attributes (use @list/attribs to list them).
  A standard attribute is one that can be set with @<attrib> instead
  of &<attrib>, and which, when set, has a predefined set of
  initial permissions.

  *** Unlike TinyMUSH, changes to the PennMUSH attribute table
  *** are not saved across shutdowns. Use these commands from
  *** God's @startup to insure they are run at each startup.

  Used without switches, @attribute shows info about a standard attrib.

  @attribute/access adds a new standard attribute into the table,
  associating it with the given space-separated list of flags.
  See 'help @set' for possible flags.
  If the /retroactive switch is added, the flags are set on every copy
  of the attribute that already exists in the database.

  @attribute/delete removes a standard attribute from the table.
  @attribute/rename renames a standard attribute. 
& @ause
  @ause <object> = <action list>

  Sets the actions to be taken when an object is successfully "used".
  
See also: use, @use, ACTION LISTS, @charges, @runout
& @away
  @away <player> = <message>

  This message is sent to a player who tries to page you when you are
  not connected, if it evaluates to something non-null.

  Example: @away me=I'm not here, please send me @mail instead.

& @boot
  @boot <player>
  @boot/port <descriptor number>
  @boot/me

  Disconnects the player from the game. 

  The /port switch takes a descriptor number instead (the "Port" number
  in WHO for wizards).

  The /me switch boots any single descriptor for the same player which
  has been idle for at least 1 minute. Players can use this command
  to terminate hung connections.

  Only admin and those with the "boot" power can @boot other players. 

& @BREAK
  @break <boolean>

  @break stops the execution of further commands in the current action
  list if its argument is a true value. It doesn't affect new queue
  entries made by previous commands in the action list. Very useful to
  people who don't like @switch.

  Examples:
  > @va obj=$testme *:@pemit %#=Before break;@break %0;@pemit %#=After break
  > testme 0
  Before break
  After break
  > testme 1
  Before break

  > @force me={@switch 1=1, think Third; think First; @break 1; think Second}
  First
  Third
  (The @switch is run, which queues 'think Third', think First is
   run, displaying 'First', command execution is broken (so we never
   think Second, and then the queued 'think Third' is run, displaying
   Third. If you figured that out, you have a very good understanding
   of the PennMUSH queue. :)

  See also: ACTION LISTS, QUEUE, BOOLEAN VALUES
& @charges
  @charges <object> = <integer>

  Allows you to limit the number of times an object can be "used". 
  The "charges" attribute will be decreased by one each time the
  object's @ause is triggered, and once it reaches zero, the object 
  cannot be used anymore.

See also: use, @runout, @ause
& @chown
  @chown[/preserve] <object>=<player>

  Changes the ownership of <object> to <player>. You can chown things,
  rooms, or exits. To chown a thing, you have to be carrying it. 
  If you do not own an object, you can only chown it if it is CHOWN_OK.
  If you're not a Wizard, you can only @chown objects to yourself or
  to a Zone Master whose zone-lock you pass.

  Normally, @chown'ing an object clears privileged flags and powers,
  and sets the object halt.  Wizards may use @chown/preserve to chown
  an object, preserving these privileges and not setting the object
  halt. Doing this to an active object with queued commands is not
  recommended, and may have strange and insecure effects.

  Examples:
    (for a room)    @chown here=me
    (for an object) @chown box=Soundwave
  
  Players can't be @chowned; they always own themselves.

See also: CHOWN_OK, Zone Masters
& @chownall
  @chownall <player> [= <target_player>]

  Transfers ownership of all the objects that the player owns to 
  <target_player>. If the target player is not included, then all 
  the objects are chowned to the person executing the command. 
  This is a wizard-only command.

See also: @chown
& @chzone
  @chzone <object>=<zone master> 
  @chzone <object>=none

  The first form of this command changes the ZONE of <object> to
  <zone master>. This puts the object on that zone and may (if the
  zone_control_zmp_only option is off) allow anyone who passes the
  zone-lock of the zone master to make changes to the object. Any
  kind of object can be @chzoned, and any kind of object can be used
  as the zone master.

  The second form of this command resets the zone of <object> to *NOTHING*.
  Anyone can reset the zone of an object s/he owns.

  If a player is @chzoned, anything s/he makes afterwards will start out
  with that Zone, but none of the objects that s/he presently owns will
  have their Zone changed. Players can @chzone themselves to a master if
  they own it. Otherwise, only wizards can @chzone players.

(continued in help @chzone2)
& @chzone2

  To see the Zone of an object, you can use either 'brief' or 'examine'
  to examine it. The Zone is listed on the same line as the Owner of
  the object.

  Players can @chzone objects they own if they own the zone master or
  if they pass its @lock/chzone.  Wizards can @chzone objects to any
  zone master as long as the object has a zone-lock.

  Whenever an object besides a player is @chzoned to a zone master, the
  WIZARD, ROYALTY, and TRUST flags will be reset, as will all @power's
  (for security purposes). For similar reasons, it is strongly recommended
  that you do not @chzone admin- or wizard-owned objects to any zone
  that less privileged players have access to.

See also: ZONES, @chzoneall
& @chzoneall
  @chzoneall <player>=<zone master>

  Changes the zone of all objects owned by <player> to <zone master>. 
  If <zone object> is "none", the zone is reset to NOTHING. Only wizards 
  may use this command.
  
See also: @chzone, ZONES
& @clone
  @clone <object, room, or exit>[=<new name>]
  @clone/preserve <object, room, or exit>[=<new name>]

  For objects, creates an exact duplicate of it and puts it in the
  current room. For exits, it creates an exact duplicate of that
  exit, except the clone's source is the current room rather than
  whatever the original exit's source was. For rooms, creates an
  exact duplicate of the room, without contents or exits. The name
  of the duplicate object can be provided; it defaults to the same
  as the name of the original object.

  The thing to be cloned must be controlled by the @cloning player.
  The clone will be owned by the @cloning player.

  If creation times are enabled, a clone will have a different creation
  time than the object it was cloned from, but will have the same
  modification time, to make tracking revisions of code easier.

  A wizard may use @clone/preserve, which has the effect of preserving
  all the bits, powers, and warnings of the original object.

  To clone a room and all its exits, use code like:
    @tel [setq(0,%l)][clone(here)]; @dol lexits(%q0)=@clone ##

See also: @create
& @command
  @command <command>
  @command/<switch> <command>

  @command provides information about and controls the availability 
  of other commands.

  With no switches, @command shows all sorts of interesting information
  about how a command is parsed.

  Switches include:
  /disable   : Disable the <command>
  /off       : Synonym for /disable
  /enable    : Enable the <command>
  /on        : Synonym for /enable
  /quiet     : Don't make noisy output when doing one of the above

  See HELP RESTRICT for more.
& @comment
  @comment <object> = <comment>

  This is a wizard-only command which sets a COMMENT attribute on
  <object>. The comment can only be seen by other wizards and royalty.
& @config
  @config/functions
  @config/commands
  @config/attribs
  @config/list[/lowercase] [<option|option-type>]
  @config/set option=value
  
  This command lists the MUSH configuration parameters, indicating what
  special things are enabled, and the cost of certain commands.
  Switches include:

  /functions  --   Lists all functions.
  /commands   --   Lists all commands.
  /attribs    --   Lists all standard attributes.
  /list       --   Lists the value of a particular <option> or <option-type>
                   if given one; lists the option-types if not.
  /set        --   Wizard only, changes parameters from the mush. See
                   help @config parameters for available ones.
& @conformat
  @conformat <object> [=<format>].

  Replaces the usual "Contents:" or "Carrying:" format when an object
  is looked at, by a player-specified contents format. This is evaluated
  as if it were a description or other similar message on the room.
  The objects that the looker would normally be able to see is passed
  as a dbref list in %0; all contents can be acquired through 'lcon(me)'.
 
  One could change the format to 'Contents: Object1 Object2 Object3'
  through '@conformat here = Contents: [iter(%0,name(##))]',
  for example. More complex things are, obviously, possible.
 
  See also: @exitformat, @nameformat
& @nameaccent
  @nameaccent <object> [=<accent template>]

  When this attribute holds an accent template that has the same
  length as the object's name, it is used to change the object's name
  in some situations (How it shows up in speech, look, and a few other
  commands). This allows for accented names without having to use the 
  accented characters directly in a name, which can make it harder for
  people to type.

  If a container has both a @nameaccent and a @nameformat, the
  @nameformat is used.

  See also: accent(), @nameformat
& @nameformat
  @nameformat <object> [=<format>]

  Customizes the usual display of the object's name to people who
  are inside it and 'look'. It is evaluated as if it were a description
  or similar message on the room. The room's dbref is passed as %0.

  @nameformat is not used when people outside the object look at it.

  Example: Show the room's zone after its name.
  @nameformat here = [name(%0)] [if(isdbref(zone(%0)),<[name(zone(%0))]>)]

  See also: @exitformat, @conformat
& @cost
  @cost <object> = <amount> 

  This sets the number of pennies that need to be given to an object to
  trigger its @pay/@opay/@apay attributes. 

  Example:
    @cost exit-machine=10
    @apay exit-machine=@open %N-exit 
    @pay exit-machine=Your exit has been created.  
 
    give exit-machine=10
    > Your exit has been created.
    (The exit will also have been opened by the machine.)

See also: give, MONEY, @pay, money()
& @cpattr
& @mvattr
  @cpattr[/noflagcopy] <obj>/<attr> = <obj1>[/<attr1>] [,<obj2>/<attr2>,...]
  @mvattr[/noflagcopy] <obj>/<attr> = <obj1>[/<attr1>] [,<obj2>/<attr2>,...]
  
  @cpattr copies an attribute from one object to another, or several 
  others. @mvattr does the same thing, except it also removes the original
  attribute from the original object. Attribute flags ARE copied as well,
  unless you use the /noflagcopy switch, which you probably want if you're
  copying from a non-standard attribute to a standard one.

  For example:
    @cpattr box/test = box/test1, cube/random, tribble/describe

  would check the object "box" for an attribute named TEST and then
  copy it to the attributes TEST1 on "box", RANDOM on the object named
  "cube", and DESCRIBE on the object named "tribble".

  If you leave out the destination attribute, the attribute is copied
  to one of the same name on the new object. For example:
    @cpattr box/test=cube
  would copy the TEST attribute from "box" to TEST on "cube".

See also: ATTRIBUTES, NON-STANDARD ATTRIBUTES
& @create
  @create <name> [=<cost>]

  Creates a thing with the specified name. Creating an object costs
  a certain amount of MUSH money, which usually defaults to 10 pennies.
  You can specify a higher cost if you wish, but not a lower one.
  This cost is refunded if you @destroy/@recycle the object.

  Once you have created an object, you can use it as a PUPPET, to store
  USER-DEFINED COMMANDS, or just as a prop. Some MUSHes choose to limit 
  the number of objects that players can create by setting a QUOTA.
 
  See also: give, @quota, MONEY
& @dbck
  @dbck
  This is a wizard only command.  It forces the database to perform a
  series of internal cleanup and consistency checks that normally run 
  approximately every 10 minutes:

  1. For every object, make sure its location, home, next, contents,
     parent, and zone fields are valid objects.
  2. Check for disconnected rooms that aren't set FLOATING
  3. For every exit, player, or thing, make sure there is exactly one
     way to reach it from a room by following the contents fields of
     non-exits, the next fields of non-rooms, and the exits fields of
     rooms.
  4. For every thing or player, make sure that it is in the contents
     list of its location. Make sure every exit is in the exits list
     of its location.
  5. Check that objects being used as zones have a @lock/zone.

  @dbck no longer performs an @purge. The results of @dbck are written
  to the game's error log, and not reported to the Wizard.

& @death
  @death <player> [=<message>]

  This command sets the message displayed to the killer when <player>
  is killed. Typing just '@death <player>' or '@death <player>=' 
  without a message will clear the currently set message.

  Example:
   @death me=You have just slain Cyclonus!

  Note that some MUSHes choose to disable the KILL command, which makes
  this attribute rather pointless.

See also: kill, BEING KILLED, @odeath, @adeath
& @decompile
  @decompile[</switch>] <object>[/<attribute-pattern>]
  @decompile/tf <object>/<attrib>

  This command produces a list of the commands that you would have to
  enter in order to recreate <object>. Useful for either copying objects
  from one MUSH to another, or for making logs of important objects to
  protect against an accidental @nuke or a crash.

  You can either @decompile an entire object, or just certain parts of it.
  To @decompile just a few attributes, for example, you could type:

      @decompile <object>/<attribute name>

  for each attribute. You can also use wildcards in <attribute name> to
  @decompile a list of similarly-named attributes.

(continued in help @decompile2)
& @decompile2
  @decompile takes five switches: /db, /flags, /attribs, /tf, /skipdefault
  Multiple switches may be usefully combined (other than /tf).

  @decompile/db
    This command makes @decompile use the object's DBREF # instead of its
    name, which is useful for editing code off-MUSH.
  @decompile/flags
    Only the code to @create the object and set flags/powers/locks is printed.
  @decompile/attribs
    Only the code to set the object's attributes is printed.
  @decompile/skipdefault
    Don't output commands to set attribute flags if those flags are the
    defaults for that attribute on that MUSH.

(continued in help @decompile3)
& @decompile3

  @decompile/tf <object>/<attribute>

  The /tf switch is useful only for users of the popular "TinyFugue" 
  client program (available from ftp.tcp.com in the directory
  /pub/muds/Clients/tinyfugue). If you do have this program, this
  switch is invaluable for editing code online, because it will grab the 
  code to set that attribute and put it into your buffer.

  To use @dec/tf, first type this command into TinyFugue:

    /def -ag -mglob -p100 -t"FugueEdit > *" fe = /grab %-2

  (you can also put this into your .tfrc so it will automatically
  be entered every time you start TinyFugue (tf).) This command works
  just like the 'FugueEdit' object originally created by van@TinyTIM.

  You can use a string other than "FugueEdit > " by setting your
  TFPREFIX attribute. This is probably a good idea.
See also: CLIENTS, ATTRIBUTES, WILDCARDS, MUSHCODE
& @describe
  @describe <object> [=<description>]

  This command sets the description of the object, which will be seen 
  whenever something looks at the object with the command 'look <object>'.
  Every object should have a description, even if just a short one 
  describing its purpose. If the [=<description>] is left out, the desc.
  on the object will be reset to nothing. When you look at something that
  has no desc., you are told, "You see nothing special."

  @describe can be abbreviated as @desc

See also: look, @adescribe
& @destroy
& @recycle
& @nuke
& @undestroy
& @unrecycle
  @destroy[/override] <object>  OR   @recycle[/override] <object>
  @undestroy <object>           OR   @unrecycle <object>
  @nuke <object>

  NOTE: @destroy and @recycle are the same command - some MUSHes
  choose to use @recycle instead of @destroy to avoid the typo of
  '@dest obj' for '@desc obj'. Others use @destroy. @nuke is an alias
  for @dest/override.

  Recycles <object> and returns the player's investment (the cost of
  @create). You should always @destroy objects you no longer need;
  this keeps the database down to a manageable size.  When an object
  is @destroyed, it is set GOING, its queue is cleared and any
  semaphores are drained, and its ADESTROY attribute is immediately
  triggered. 

(continued in help @destroy2)
& @destroy2

  GOING objects are actually removed from the db approximately every
  10-20 minutes. Until then, you may use the @undestroy/@unrecycle
  command to abort the destruction sequence. If you @undestroy an
  object, its STARTUP attribute is triggered. If you @destroy a
  GOING object, it is purged immediately.

  Wizards may @nuke players. If the DESTROY_POSSESSION config option
  is set (see @config), destroying a player destroys all non-SAFE
  things the player owns, and @chowns SAFE things to God. If not,
  destroying a player @chowns all their objects to God.

See also: SAFE, GOING, DESTROY_OK  
& @dig
  @dig <room name> [= <exit name>;<exit alias>*,<exit name>;<exit alias>*]
  @dig/teleport
  
  This command is used to create a new room, possibly with exits linking
  it to the room you are standing in. This command normally costs 10 pennies,
  although some MUSHes may have different amounts or may restrict this 
  command to those with the builder @power.
  
  @dig/teleport will automatically @tel the digger to the new room.

  If you use the long form of this command, an exit to the new room
  from the one you are standing in and an exit back from the new room
  will both be automatically @open'ed and @link'ed. You may have as 
  many or as few exit aliases for an exit as you like, separated in the
  command by semicolons. The exit leading to the new room is separated
  from the exit leading back by a single comma.

(continued in help @dig2)
& @dig2
  Examples: 
  @dig Kitchen
    This command will create a new room named 'Kitchen'. You will be informed
    what the dbref # of this room is.

  @dig Kitchen = Kitchen <N>;n;north;kitchen;k
    This will create the room as above and also open an exit leading
    to it named "Kitchen <N>;n;north;kitchen;k". It will appear in the 
    list of Obvious exits as just "Kitchen <N>", but you will be able to
    go through it by typing any of the following: n, k, north, kitchen
    It will NOT create an exit coming back from the Kitchen room.

  @dig Kitchen = Kitchen <N>;n;north;kitchen;k,Out <S>;s;south;out;o
    This will do just the same as the above, except it will also create
    an exit named "Out <S>;s;south;out;o" coming back from the kitchen
    to whatever room you are currently in.
    
See also: @open, @link, EXITS, @create
& @doing
  @doing <message>
  @doing/header <message>

  This command sets a short message that shows up in the WHO/DOING listing
  next to your name. @doing/header <message> works exactly like @poll and
  can only be used by Wizards or those with the poll power.

See also: @poll, WHO, DOING
& @dolist
  @dolist[/notify][/delimit] [<delim>] <list> = <action>
  
  @dolist executes the <action> for each element in <list>. If <list> is a
  function, it will be evaluated to obtain the necessary list to use. It
  may be any space-separated list of strings, which can be object numbers,
  attributes, or arbitrary words. If the /delimit switch is given, the first
  character of the list is used as the separator, instead of space.
  
  <action> is a command or list of commands enclosed in braces { }
  and is performed once for every item in <list>. The special symbol "##"
  is replaced by the corresponding item from <list>.  The special symbol
  "#@" is replaced by the position of that item in the list.
 
  If the /notify switch is used, a "@notify me" is queued after all the
  list commands. This is useful for object synchronization with semaphores.
   
  Example: @dolist [lcon(here)] = "[name(##)]
    would cause you to say the name of all objects in the room.
& @drain
  @drain[/any][/all] <object>[/<attribute>][=<number>]
  
  This command discards commands waiting on a semaphore without
  executing them.

  If the /any switch is given, then all semaphores associated with
  <object> are @drained.  Otherwise, the only the specified semaphore
  attribute (or SEMAPHORE if no attribute is specified) is @drained.

  If the /all switch is given, then all queue entries associated
  with the selected semaphore(s) are discarded, and the semaphore
  attribute(s) are cleared.  Otherwise, only the indicated <number>
  of queue entries are discarded.  If no <number> is given, then
  the /all switch is assumed.

  You may not specify both the /any switch and a specific attribute.
  Similarly, you may not specify both the /all switch and a number.

  See also the help for: SEMAPHORES, @notify, @wait
& @drop
  @drop <object> [=<message>]. <object> can be a thing, player, exit,
  or room, specified as <name> or #<number> or 'me' or 'here'. Sets 
  the drop message for <object>. The message is displayed when a 
  player drops <object>. Without  a message argument, it clears the 
  message. 

  On an exit, this message is sent to a player after they pass through
  the exit.

  See also: drop, @odrop, @adrop.
& @dump
  @dump [/paranoid] [check interval]
 
  This is a wizard only command that saves a copy of the current memory
  database out to a save file.  This preempts the normal regular dumping
  that the mud performs on its own.
 
  If the /paranoid switch is used, the game performs additional consistency
  checking which corrects possible data corruption. If a check interval
  is specified, the game writes confirmation of the dump to the checkpoint
  log file every <interval> objects. If no interval is specified, it is
  taken to be the size of the database, divided by 5.
  This switch should ONLY be used if a normal @dump is not being done
  correctly. Paranoid dumps should generally only be done by wizards with 
  access to the account on which the MUSH is running, since others will
  not have access to the checkpoint log file.
& @ealias
  @ealias <object> = <enter alias>

  This allows a player to type the enter alias instead of "enter <object>"
  If you have a chair, you could "@ealias chair = sit down" and then just
  type "sit down" instead of "enter chair" - using the object name is
  not necessary. Note that the enter alias is checked after normal exits.
  Like an exit, it may have a semi-colon separated list of words,
  i.e. sit down;sit;sit on chair
& @edit
& @gedit
  @edit <object>/<pattern> = <search>,<replace> 
  @edit <object>/<pattern> = $,<string to append>
  @edit <object>/<pattern> = ^,<string to prepend>

  This is useful when you don't want to have to retype those obnoxiously 
  long descriptions just to make one little change.  Instead, search and 
  replace via @edit.  
  
  <pattern> is a pattern, optionally containing wildcards, for the attribute 
  names you wish to edit. Only attributes already defined on <object> may be 
  edited. <search> and <replace> are two strings. It's also possible to use 
  "$" and "^" to signal appending and prepending text, respectively.
  
  If the text contains commas, percent signs, or similar special characters,
  it usually must be enclosed in curly braces.
  
  See also ATTRIBUTES, edit()
& @efail
  @efail <object> = <message>
  This is the message shown to the player who fails to enter the object.
& @elock
  @elock <object> = <key>
  Enter-locks an object, restricting who is allowed to enter it. Special
  lock types are supported (see "help @lock" for details). Only objects
  which are ENTER_OK may be entered, regardless of the key.
 
  Rooms don't use ENTER_OK or @elock; they use @lock/teleport
  instead. Only people who pass the room's teleport lock, are wizards
  or royalty, or control the room, will be allowed to @teleport into the
  room. (Note that this is different from NO_TEL, which prevents people
  from teleporting out of a room).  The teleport lock is evaluated even
  if the room is JUMP_OK - in other words, if you are trying to teleport
  into a room you don't control, the room must be JUMP_OK, and you must
  pass the teleport lock.

  Note that the enter lock of an object or room being used as a Zone
  Master Object determines control of that zone. Please note that if
  you're using a room as a ZMO (i.e. as a zone master room), only the
  controllers of that zone will be able to teleport into that room
  (which is a good thing for security).
& @emit
& \  
  @emit[/room][/silent] <message> 
  @emit[/noeval] <message> 
  \<message>

  This sends <message> to every person in the current room. However, no
  identifier marking it as being sent by you is shown.  For example,
  @emit foo would show 'foo' to every object in the room. 

  The /room switch makes this command equivalent to "@lemit". 
  The /silent switch in combination with /room suppresses the
   @lemit confirmation. It has no effect without /room.
  The /noeval switch prevents the MUSH from evaluating the message.

  @emit can be abbreviated "\"

  See also @pemit, @remit, @oemit, @lemit, NOSPOOF and SPOOFING.
& @enable
& @disable
  @enable <parameter>
  @disable <parameter>
  
  These are wizard commands that allow certain parameters of the game to
  be changed at runtime. The values of these parameters are listed by the
  "@config" command. Common parameters and their effects are as follows:
  
  logins       --  When logins are disabled, only wizards and royalty may
                   log into the game. Mortals attempting to log in will be
                   given the down text, as well as the @rejectmotd.
  guests       --  When guests are disabled, players can not log in as
                   guest characters.
  pueblo       --  Turns on HTML output for the Pueblo client.
  log_commands --  When this is enabled, all commands are logged.
  log_huhs     --  When this is enabled, all commands that produce a "Huh?"
                   are logged.
  log_forces   --  When this is enabled, @forces done by wizards are logged.
  log_walls    --  When this is enabled, @walls are logged.

  Actually, any boolean (Yes/No) runtime option can be enabled or
  disabled with these commands, as a shortcut for @config/set.

  @enable <option> is the same thing as @config/set <option>=yes
  @disable <option> is the same thing as @config/set <option>=no
& @zenter
& @ozenter
& @azenter
  @zenter <ZMO> = <message>
  @ozenter <ZMO> = <message>
  @azenter <ZMO> = <action>
  
  These attributes set the message shown to a player who enters a room in
  a new zone (@zenter), the message shown to others in the room in the
  new zone when the player enters (@ozenter), and the action triggered
  by the entry (@azenter).

  Entry into a new zone is said to occur when a player goes from 
  a room not in the zone to a room in the zone. "Room" in this context
  means the player's absolute room (outermost container), so entering
  and leaving unzoned objects within a zoned room doesn't trigger these.

  Zone entry is assumed to occur before room entry, so these are
  triggered before the room's @[oa]enter.

See also: @zleave, @ozleave, @azleave, ZONES
& @zleave
& @ozleave
& @azleave
  @zleave <ZMO> = <message>
  @ozleave <ZMO> = <message>
  @azleave <ZMO> = <action>
  
  These attributes set the message shown to a player who leaves a room in
  a zone (@zleave), the message shown to others in the room in the
  old zone when the player leaves (@ozleave), and the action triggered
  by the leave-taking (@azleave).

  Leaving a zone is said to occur when a player goes from a room in
  the zone to a room not in the zone. "Room" in this context means the
  player's absolute room (outermost container), so entering and leaving
  unzoned objects within a zoned room doesn't trigger these.

  Zone leaving is assumed to occur after room leaving, so these are
  triggered after the room's @[oa]leave.

See also: @zenter, @ozenter, @azenter, ZONES
& @enter
  @enter <object> = <message>

  This sets the message that is displayed to anyone entering the 
  object. Works just as @success on an exit does.

  Example:
    @enter Chair = You sit down on the comfy chair.
    enter chair
    > You sit down on the comfy chair.

See also: @oenter, @oxenter, enter
& @entrances
  @entrances[/<switch>] <object> [=<begin>,<end>]
  
  This command will show you all exits linked to the object you use the
  command on, as well as where the exit originates.  This command is
  computationally expensive and costs the same as @find. You can limit
  the range of the dbrefs searched by specifying <begin> and <end>.
  
  It takes four switches:
  
  /exits       show only exits linked to <object>
  /things      show only things which have their homes in <object>
  /players     show only players who have their homes in <object>
  /rooms       show only rooms which have a drop-to of <object>
& @eunlock
  @eunlock <object>

  Enter-unlocks an object, in a fashion similar to @unlock. For anyone
  to be able to enter an object, it must be both @eunlocked and ENTER_OK.
  You can also simply type 
    @lock/enter <object> 
  to unlock an object.

See also: @lock, locktypes, @elock
& @exitformat
  @exitformat <object> [=<format>].

  Replaces the usual "Obvious Exits:" format when an object is looked
  at, by a player-specified exits format. This is evaluated as if it
  were a description or similar message on the room.  The objects that
  the looker would normally be able to see is passed as a dbref list
  in %0; all exits can be acquired through 'lexits(me)'.
 
  One could change the format to 'Exits: Exit1 Exit2 Exit3' through
  '@exitformat here = Exits: [iter(%0,name(##))]', for example.

  See also: TRANSPARENT, @conformat, @nameformat
& @failure
  @failure <object> [=<message>]

  Sets the message shown to someone who fails to pass the object's
  basic @lock. For a thing or player, this would be when someone tries
  to pick the object up and fails. For an exit, this occurs when someone
  tries to go through the exit and fails.

  If [=<message>] is omitted, any currently set message will be reset.

  Can be abbreviated @fail. It is recommended that you put an @fail message
  on any locked object.

See also: FAILURE, @ofailure, @afailure
& @firstexit
  @firstexit <name of exit>

  Makes the named exit the first in the listing of Obvious Exits in a
  room. You must control the room in order to use this command.

See also: EXITS, @open, @link
& @filter
  @filter <object> = <pattern 1>, <pattern 2>, <pattern 3>, ...
 
  This attribute is meant to be used in conjunction with the AUDIBLE
  flag. The @filter of an object is a comma-separated list of wildcard
  patterns (like @switch patterns). Any messages which match one of the 
  patterns is suppressed and not propagated through the AUDIBLE object
  with the @filter set. (Note: @filter on rooms has no effect!)
 
  Please note that you should NOT use curly brackets {} in an @filter
  pattern. If you want to filter a message containing a comma, you
  need to put a \ before it. Also note that AUDIBLE exits will not
  take effect unless the room they lead from is also set AUDIBLE.

  See 'help @filter2' for more.
& @filter2
 If the @filter attribute is flagged REGEXP, the patterns are considered
 regular expressions, not wildcards. The CASE attribute flag is also
 respected. 

Example: 
  An exit leads from the room where Wizard is standing to another
  room where the puppet "Wiztoy" is standing. The exit is set AUDIBLE.
  
    @prefix exit=From inside,
    :tests.
    > Wizard tests.
    Wiztoy> From inside, Wizard tests.
    @filter exit=* jumps.,* tests.
    :jumps.
    > Wizard jumps.
    :tests.
    > Wizard tests.
  (Wiztoy doesn't hear anything, because it is filtered out.)
    :tests again.
    > Wizard tests again.
    Wiztoy> From inside, Wizard tests again.

See also: AUDIBLE, @infilter, LISTENING
& @find
  @find [<name>] [=<begin>,<end>]

  Displays the name and number of every room, thing, or
  player that you control whose name matches <name>. Because the
  command is computationally expensive, this costs 100 pennies.
  You can limit the range of the @find by specifying <begin> and
  <end>, where these are the first and last dbrefs to examine.

  Some MUSHes may choose to restrict @find only to Royalty. Even if 
  not, it is recommended that you use @search instead, as it can be
  limited more effectively.

See also: @search
& @follow
  @follow <object> = <message>

  Sets the message shown to someone after they begin following 
  the object (using the 'follow' command). 

See also: follow, unfollow, followers(), @ofollow, @afollow
& @FORWARDLIST
  @forwardlist <object> [=<list of dbrefs>]

  When an object set AUDIBLE hears sound that passes its @filter, its
  @forwardlist attribute is checked, and if present, the sound (Prefixed
  by the object's @prefix attribute) is forwarded to all the dbrefs in the
  @forwardlist, like puppets do to their owners.

  The @forwardlist must be a space-seperated list of dbrefs. 
  In order to forward to an object, you must either control it,
  have the pemit_all power, or, if it has a @lock/forward set,  pass 
  its @lock/forward.  (If you want to allow all objects you own to
  forward to you, regardless of whether or not they control you, use
  @lock/forward me=$me)

See also: @filter, @prefix, AUDIBLE, PUPPET
& @unfollow
  @unfollow <object> = <message>

  Sets the message shown to someone after they stop following 
  the object (using the 'unfollow' command). 

See also: follow, unfollow, followers(), @ounfollow, @aunfollow
& @force
  @force[/noeval] <object>=<command>

  This forces the object to perform the command just as if it had
  typed it in itself. Only wizards may @force other players. You
  can @force any object which you own or control. Useful for
  manipulating puppets. If <object> is not in the same room as you,
  you can instead use the object's dbref number. 

  @force can be shortened to @fo or @for, or abbreviated as:
    <dbref #> <command>

(continued in help @force2)
& @force2

  Normally, the command is parsed for function evaluation and 
  substitutions twice - once when @force is run, once when
  the forcee runs the command. @force/noeval will only
  evaluate the command when the forcee runs it.

Example:
  @create Lackey
  > Created: Object #103 
  @fo Lackey = go east
  > Lackey goes east.
  > Lackey has left.
  @fo #103 = page Cyclonus = Hi there!
  > Lackey pages: Hi there!
  #103 page Cyclonus = Whee
  > Lackey pages: Whee

See also: PUPPET, DBREF 
& @function
  @function [<function name>]
  @function <function name>=<object>,<attribute>
    or @function <function name>=<object>/<attribute>
  @function/<switch> <function name>
  
  When used without any arguments, this command lists all global
  user-defined functions. For wizards and others with the Functions
  power, it also lists the dbref number and attribute corresponding
  to the listed functions.

  When used with a function name, it displays some information
  about how that function is parsed, and how many arguments it
  takes.
  
  <switch> can be one of:
  /disable, to disable a built in function.
  /enable, to re-enable it.
  /delete, to remove a user-defined function.

  Otherwise, this command defines a global function with the name
  <function name>, which evaluates to <attribute> on <object>.
  <object> can be anything that the player using the @function command
  controls. <function name> must be 30 characters or less.

(continued in help @function2)
& @function2
  A function defined using @function works just like any of the normal
  MUSH functions, from the user's perspective. The functions are
  executed by the object, with its powers. 
 
  Functions defined via @function should follow the format used by
  UFUN() - %0 is the first argument passed, %1 is the second argument
  passed, and so forth.
  
  Example:
  
    > &WORD_CONCAT #10=%0 %1
    > say "[ufun(#10/word_concat,foo,bar)]
    You say, "foo bar"
  
    > @function word_concat = #10, word_concat
    > say "[word_concat(foo,bar)]
    You say, "foo bar"
 
(continued in help @function3)
& @function3
  Global user-defined functions are not automatically loaded when the
  game is restarted. In order to avoid objects which attempt to use
  functions that have not been loaded, a @startup containing @function
  commands should be set on a wizard object with as low a dbref number 
  as possible; object #1 (generally God) is suggested for this use.

  For example, if you have one object that stores all your global
  functions, you could set the following command (the object is #100
  in the example):

    @startup #1=@dol lattr(#100)=@function ##=#100,##

  And then store each function as an attribute of the same name on 
  object #100.
(continued in help @function4)
& @function4
 Normally, built in functions cannot be overriden by @functions.
 However, if a built-in function is deleted with @function/delete,
 you can then make a @function with the same name. 
 @function/restore will delete the @function and turn the built in
 version back on.

 For example:
  @function/delete ansi
  &ansi_fun #1234=%0
  @function ansi=#1234, ansi_fun

 will create a new version of ansi() that doesn't do any
 colorization.

See also: RESTRICT, FUNCTIONS, @startup
& @grep
  @grep[/<switch>] <object>[/<attrs>]=<pattern>
  
  This command searches attributes in an object for <pattern>. It takes
  four switches:
  @grep/list
    Lists the names of the attributes on the object containing <pattern>.
  @grep/ilist
    Same as above, but is case-insensitive when trying to match <pattern>.
  @grep/print
    Prints out all the attributes, highlighting the pattern itself in 
    boldface, if you're ANSI.
  @grep/iprint
    Same as above, case-insensitive.

  When used without a switch, @grep defaults to @grep/list.
(continued in help @grep2)
& @grep2

  You must be able to see attributes on <object> (i.e. you must control
  the object, it must be VISUAL, or you must be a Wizard or Royalty).
 
  <attrs> is an optional wildcard pattern specifying attributes to
  match (much like @edit). If <attrs> is not provided, all attributes
  are assumed (just as if you had provided "*").
   
  <pattern> is not treated as a wildcard pattern, so you can grep for
  patterns containing '*', '?', etc.  Also, <pattern> is NOT PARSED,
  so '[v(0)]' and the like can be searched for.
& @halt
  @halt <object> [=<new_command>] 
  @halt/all
 
  The @halt command removes all queued actions for <object>. 
  If <new command> is specified, that new command is placed
  in the queue for the object instead. If no new command is
  specified, the object is set HALT.

  If <object> is a player, it clears the queue for the player and
  and all of his objects. You can use "@halt me" to clear your own
  queue without setting yourself HALT. Only wizards can @halt 
  other players.
  
  Note that halting an object does NOT affect any objects waiting
  on it as a semaphore.

  @halt/all is a synonym for @allhalt and is a wizard-only command.

See also: HALT, QUEUE, @ps
& @haven
  @haven <player> = <message>

  This message is sent to a player whose pages you are refusing, either
  through use of the HAVEN flag or through the use of a page lock, if
  it evaluates to something non-null.

See also: HAVEN, page, @lock, @away
& @hide
  @hide[/<switch>]
  
  This command enables a royalty, wizard, or player with the Hide
  power to disappear from the WHO list for mortals. "@hide/yes" or "@hide/on"
  hides the player, "@hide/no" or "@hide/off" unhides the player.
  Hidden players are marked as "(Hide)" in the privileged WHO listing.
 
  Mortals can not use the CONN(), IDLE(), or LWHO() functions to find 
  hidden players.

& @idescribe
& @oidescribe
& @aidescribe
  @idescribe <object> [=<description>]
  @oidescribe <object> [=<message>]
  @aidescribe <object> [=<action list>]

  @idescribe command sets the internal description for an object, which is 
  shown to anyone who enters or looks while inside the object. Meaningless 
  for rooms and exits. May be abbreviated to @idesc.

  @oidescribe sets the message seen by others when someone looks at the 
  idesc, and @aidescribe sets the action the object will take (just as 
  with @desc, @odesc, @adesc). 

  If there is no IDESCRIBE set for an object, those who enter or look 
  inside it will see its @desc, and no o-message or action will be
  available. If you want to use @aidescribe without @idescribe, set 
  @idescribe to a blank string.

  If [=<description>] or [=<message>] omitted, the attribute will be 
  reset.
  
See also: enter, @enter, ENTER_OK, @describe, look
& @hook
  @hook/<switch> <command>[=<object>, <attribute>]

  @hook tells the command parser to evaluate given attributes at certain points
  in command evaluation. The possible points, indicated by the proper switch:

  @hook/before: The attribute is evaluated before the command itself is run.
  @hook/after: The attribute is evaluated after the command is run.

  In all cases, %# is the dbref of the object doing the command, and all
  hooks share the same set of q-registers. The results of the evaluated
  attribute is thrown away like it was wrapped in a call of null(). Also,
  in cases where a command and function do the same thing (e.g., @pemit and
  pemit()), only the command gets the hooks.

  Leaving out the object and attribute clears an existing hook. Wizards can
  see existing hooks with @command.

  See HELP @HOOK2 for an example.
& @hook2
  An example of @hook:

  > &top_line #3=pemit(%#, What follows is a the results of a look)
  > &bottom_line #3=pemit(%#, You're done looking.)
  > @hook/before look=#3, top_line
  > @hook/after look=#3, bottom_line
  > look
  What follows is the results of a look
  Room Zero
  You are in Room Zero. It's very dark here.
  You're done looking.
& @idle
  @idle <player> = <message>

  This message is sent in return to every page which successfully reaches
  you if it evaluates non-null. It is useful if you are idle for long 
  periods of time and wish to inform people where you are, or if you
  are in a meeting and cannot quickly return pages.

  Clever example: 

   @idle me=[switch(gt(idlesecs(me),120),1,I'm idle. Use @mail,)]

  Players paging me will only see the "I'm idle" message if I've been
  idle for over 2 minutes (120 seconds).
& @infilter
  @infilter <object> = <pattern 1>, <pattern 2>, <pattern 3>, ...
  
  @infilter is meant to be used on objects that have an @listen of "*"
  (ie, objects that listen to everything, which is commonly used for 
  things like chairs so that someone inside the object can hear 
  everything said/done outside it). @infilter filters out any messages
  that match one of the patterns and prevents those inside the object
  from hearing them. It does not stop the @ahear of the listening object
  from being triggered by things that match the @listen.
 
  For an explanation of infilter patterns, see the help for "@filter".

See also: @filter, @listen, AUDIBLE, LISTENING
& @inprefix
  @inprefix <object> = <message>
  
  @inprefix is intended for use with objects with a @listen of "*".
  It prepends the <message> string to any message propagated to the
  contents of <object> from the outside. If there is no @inprefix,
  no string is prepended to the output.
  
  Example:
  
  [ First, @create Vehicle and Test (objects #103 and #104) and drop them ]
    > @inprefix Vehicle = From outside,
    Vehicle - Set.
    > enter Vehicle
    Vehicle(#103)
    > @force #104=:bounces.
    From outside, Test bounces.

See also: @prefix, @listen, @infilter
& @kick
  @kick <number>
  
  This wizard-only command forces the immediate execution of <number>
  items from the queue. Rarely useful. If your MUSH is lagging badly,
  chances are high that it stems from network problems. Check the queue
  before using this command.

See also: @ps, QUEUE
& @lalias
  @lalias <object> = <leave alias>

  Sets the leave alias(es) of an object that is ENTER_OK. Setting a leave 
  alias allows people to type the leave alias instead of the "leave"
  command in order to get out of the object. Meaningless for exits and
  rooms.

  You can set multiple leave aliases on an object by separating them with
  semi-colons.
  Example:
      @lalias chair=stand up;stand;get up;rise

See also: @ealias, leave, @leave, @lfail
& @leave
  @leave <object> = <message>
  
  Sets the message that is displayed to anyone leaving <object>. 
  
See also: leave, @lfail
& @lemit
  @lemit[/silent][/noeval] <message>

  Emits a message to the outermost container object. For example, if you
  are carrying a bird, and are inside a vehicle which is in room #10, and
  you force the bird to @lemit "Cheep", everyone in room #10 will hear
  "Cheep". This command is the same as "@emit/room". 

  The /silent switch suppresses the normal confirmation message.
  The /noeval switch prevents <message> from being evaluated.
& @lfail
  @lfail <object> = <message>

  This is the message shown to the player who fails to leave the object,
  either because the object is set NO_LEAVE or because the person leaving
  fails the leave-lock.

See also: leave, @leave, NO_LEAVE, locktypes
& @list
  @list/<switch>[/lowercase]
  @list[/lowercase] <switch>

  The @list command lists useful MUSH information.

  Switches include:
  /motd      : Alias for @listmotd, shows current messages of the day.
  /functions : Alias for @config/functions, shows all functions
  /commands : Alias for @config/commands, shows all commands
  /attribs : Alias for @config/attribs, shows all standard attribs
  /lowercase : Show whatever you're showing in lowercase, rather than upper.
& @listmotd
  @listmotd

  This command lists the current MOTD (message of the day) for the MUSH.
  If used by a wizard or admin, it will also include the wizard, full, and
  down MOTDs to the user. Same as @list/motd.

See also: @list
& @link
  @link[/preserve] <object>=<dbref | here | home | variable>

  Links <object> to either a room or a thing. If a thing or player is
  linked, that sets the object's HOME. If a room is linked, that sets 
  the object's drop-to room, which is where objects that are dropped
  in the room will be sent to.

  Most often, @link is used to link or relink an exit to a destination 
  room. In order to link an exit to a room, you must either own or
  control the room, OR the room must be set LINK_OK. If the exit is
  currently unlinked, and you pass its @lock/link, you may link it even
  if you do not own it. In this case, the exit will be @chowned to you
  (and set HALT).  Linking an exit may have a cost (usually 1 penny.)
  The Wizard-only /preserve switch can be used to link without @chowning
  and HALTing the exit.

  If the destination of an exit is "variable", its destination is
  determined at the time of travel by the attribute DESTINATION on the
  exit, which is evaluated like a U()-function. You must have permission
  to link to whatever the DESTINATION evaluates to in order for the exit
  to work. If there's no DESTINATION attribute, the EXITTO attribute
  is also tried.

  If the destination is "home", those who travel through the exit will
  be sent to their homes.

  LINK_OK objects can also be used as semaphores, and any object can be
  @parented to them.

See also: EXITS, @open, @dig, DROP-TO, HOME
& @listen
  @listen <object> = <string>

  Sets the object's listen pattern to <string>, which can have wildcards.
  Whenever something the object hears matches the pattern, the object's
  ahear/amhear/aahear attribute will be triggered. In addition, anything 
  inside the object will hear it as well.

For example:
  @listen Chair = *  
    Since the wildcard (*) matches anything, anyone inside the object will
    hear anything said outside it.
  @listen Butler = * has arrived.
  @ahear Butler = :walks over to the new arrival and takes %p coat.
  > Cyclonus has arrived.
  > Butler walks over to the new arrival and takes his coat.
    In this case, the listen pattern is met whenever someone 'arrives' in
    the room, and then the object does whatever is inside its @ahear 
    attribute.

(continued in help @listen2)
& @listen2
  An object "hears" anything that another player standing in the same room
  would hear. For example, if you type in a command, the object does NOT
  hear it. If the command has a result that people in the room hear, the
  object will hear it.

For example:
  @listen Recorder = @emit *
  @ahear Recorder = :records {%0}
  @emit Whee!
  > Whee!
    In this example, the Recorder's listen-pattern is NOT matched, because
    it doesn't hear the '@emit Whee!', it only hears the 'Whee!' part, which
    doesn't match.

  @listen Recorder = Cyclonus says, "*"
  "Whee!
  > Cyclonus says, "Whee!"
  > Recorder records: Whee!

See also: LISTENING, @ahear, @amhear, @aahear
& NEW LOCKS
  In PennMUSH 1.7.5, several new features have been added to locks.

  Locks can now be inherited off of parents, just like attributes.
  By default, locks are set no_inherit, but this flag can be cleared.

  There are now lock flags including ones to control inheritance,
  copying in a @clone, who can set them, and so on. Details are
  in HELP @LSET.
  
  Indirect lock keys (@#1234) can now refer to other lock names on
  objects, not just a lock of the same name. See HELP @LOCK4.

  There is a new lock key for testing flags and object types. 
  See HELP @LOCK9 for more information.
& LOCKING
& LOCKS
& @lock
  @lock[/<switch>] <object>=<key> 
  
  This command "locks" the object, specifying (by the key) who or what can
  do certain things with the object. There are many different types of locks,
  all of which are described in "help locktypes" and which are designated by
  the switch. The "basic" lock determines, for players and objects, who can
  pick them up. For exits, it determines who can go through the exit.
  All other locks can be set the same way as the basic lock.

  Whenever you "pass" the basic lock, you succeed in doing something with
  the object. This triggers the @success/@osuccess/@asuccess
  messages and actions. If you fail to pass the basic lock, you trigger
  the @failure/@ofailure/@afailure messages and actions. Other locktypes
  may also have such success/failure messages.

  You can specify <object> and <key> as either the name of an object in
  the immediate area, a DBREF number, "me", or "here". 

  Many new features have recently been added to locks. See HELP NEW LOCKS
  for details.

(continued in help @lock2)  
& @lock2
  You can lock an object in several different ways. The simplest lock is to
  lock it to one other thing:
   @lock My Toy = = me
     This locks the object "My Toy" to you and you alone. It is recommended
     that you @lock me == me in order to prevent anyone else from picking
     you up. The two = signs are NOT a typo!

  You can lock an object -against- one other object as well, using the '!' 
  symbol:
    @lock Shared Toy = !Vector Sigma
      This locks the object "Shared Toy" to everyone -except- Vector Sigma.
      Everyone except Vector will be able to pick up the object.

(continued in help @lock3)
& @lock3
  You can lock an object to something that has to be carried:
    @lock Door = +Secret Door Key
      This locks the exit "Door" to someone carrying the object "Secret Door
      Key". Anyone carrying that object will be able to go through the exit.

  You can lock an object to -either- an object or to someone carrying the
  object with:
    @lock Disneyworld Entrance = Child
      This locks the exit "Disneyworld Entrance" to either the object 
      "Child" -or- to someone carrying the object "Child". (OK, so it's
      a weird example.)
  
  You can lock an object to a specific player by using a *:
    @lock Note == *Jazz
      Only the player "Jazz" will be able to pick up the Note object.
  
(continued in help @lock4)
& @lock4
  An "owner" lock allows you to lock something to anything owned by the
  same player:
    @lock Box = $My Toy
      This locks "Box" to anything owned by the owner of "My Toy" (since
      players own themselves, that includes the owner as well).

  An "indirect" lock allows you to lock something to the same thing as
  another object (very useful in setting channel locks; see help @clock):
    @lock Second Puppet = @First Puppet
      This locks the object "Second Puppet" to whatever the object 
      "First Puppet" is locked to. Normally, the lock type that is checked
      is the same as the lock on the first. You can specify a different
      lock type with @object/LOCKNAME. For example:
      @lock Second Puppet = @First Puppet/Use
      Second Puppet's basic lock now checks First Puppet's use lock.

  There are also some more complex locks called attribute and evaluation
  locks. In addition, you can make complex locks (combining several types
  or reversing them).

(continued in help @lock5)
& @lock5
ATTRIBUTE LOCKS
  You can lock an object to an attribute on the person trying to pass 
  the lock (as long as the object can "see" that attribute):

    @lock <object>=<attribute>:<value>

  <value> can contain wildcards (*), greater than (>) or less than (<)
  symbols.

  For example:
    @lock Men's Room = sex:m*
      This would lock the exit "Men's Room" to anyone with a SEX attribute
      starting with the letter "m". 
    @lock A-F = icname:<g
      This would lock the exit "A-F" to anyone with a ICNAME attribute
      starting with a letter "less than" the letter "g". This assumes
      that ICNAME is visual or the object with the lock can see it.

(continued in help @lock6)
& @lock6
COMPLEX LOCKS
  You can combine or reverse locks very easily using the following 
  BOOLEAN symbols and parentheses () to group them:
    &      - "and"
    |      - "or"

  For example:
   @lock My Toy = =me | !*Chromia | +Toy Box Key
      This locks "My Toy" to me, -against- the player Chromia, or to anyone 
      carrying the object "Toy Box Key". 
   @lock My Toy = *Marissa & +Toy Box Key
      This locks "My Toy" to the player Marissa, who needs to be carrying
      the object "Toy Box Key".
   @lock My Toy= *Chromia | ( *Marissa & +Toy Box Key )
      This locks it to Chromia, OR to Marissa if she is carrying the Key.

(continued in help @lock7)
& @lock7
EVALUATION LOCKS
  An evaluation lock is set using this format:

    @lock <object>=<attribute>/<value>

  The difference between this and an attribute lock is that the <attribute>
  is taken from <object> rather than from the person trying to pass the
  lock. When someone tries, <attribute> is evaluated, and the result is 
  compared to <value>. If it matches, then the person passes the lock.

  The person trying to pass the lock is %# and <object> is %! when the
  evaluation takes place. The evaluation is done with the powers of
  <object>. If you try to do something (like [get(%#/<attribute>)]) and
  <object> doesn't have permission to do that, the person will automatically
  fail to pass the lock.

(continued in help @lock8)
& @lock8

  Example: 
    @lock Stage = ispuppet/1
    &ispuppet thing = hasflag(%#, PUPPET)
      This locks the object "Stage" to puppets only.

      Whenever someone tries to pick up the object, the attribute 
      "ispuppet" will be checked, substituting in the person's DBREF number
      for %#. 
 
      [hasflag(<dbref>, PUPPET)] will come out to 1 if the object with 
      <dbref> has the "PUPPET" flag. Otherwise, it will come out to be 0. 
      Since the value in the @lock is 1, only objects with the PUPPET flag
      will be able to pass this lock.

(continued in help @lock9)
& @lock9
  You can also test for set flags, powers, or object types in a lock directly,
   without using an evaluation lock, with these formats:

    @lock <object>=flag^<flag>
    @lock <object>=type^<type>
    @lock <object>=power^<power>

  These locks act like the object the lock is on does a hasflag(%#, <flag>),
  hastype(%#, <type>), or haspower(%#, <power>) succeeding if the flag is set.

  You can test for channel membership with:

    @lock <object>=channel^<channel>

  For example,
    @lock/use Admin Commands=flag^wizard|flag^royalty

See also: locktypes, @clock
& locktypes
& locklist
& lock types
& lock list
  Your MUSH will almost certainly support these standard lock types:

  @lock/basic           Who can pick up the player/object, or go through
                        the exit.
  @lock/enter           Who can enter the player/object (aka @elock)
  @lock/teleport        Who can teleport to the room
  @lock/use             Who can use the object (aka @ulock)
  @lock/page            Who can page the player
  @lock/zone            Who can control objects on this zone
  @lock/parent          Who can @parent something to this object/room
  @lock/link            Who can @link something to this object/room
                        or who can @link this unlinked exit.
  @lock/mail            Who can @mail the player
  @lock/user:<name>     User-defined. No built-in function of this lock,
                        but users can test it with elock()

  See 'help locktypes2' for more
& lock types2
& locktypes2
  More standard lock types:

  @lock/speech          Who can speak/pose/emit in this room
  @lock/listen          Who can trigger my @ahear/^-pattern actions
  @lock/command         Who can trigger my $-pattern commands
  @lock/leave           Who can leave this object
  @lock/drop            Who can drop this object or in this room
  @lock/give            Who can give this object
  @lock/follow          Who can follow this object
  @lock/examine         Who can examine this object if it's VISUAL
  @lock/chzone          Who can @chzone to this object if it's a ZMO
  @lock/forward         Who can @forwardlist a message to this object 
  @lock/control		Who can control this object (only if set)
  @lock/dropto		Who can trigger this container's drop-to.
  @lock/destroy		Who can destroy this object if it's DESTROY_OK

  See also: @lock, @lset, @clock, FAILURE
& @lset
  @lset <object>/<lock type>=[!]<flag>

  This commands sets or clears flags on locks.
  Valid flags include:
  
  visual     (v)     This lock can be seen even if the object it's on
                     isn't visual.
  no_inherit (i)     This lock isn't inherited off of parents. All locks
                     are set no_inherit by default.
  no_clone   (c)     This lock isn't copied by @clone.
  wizard     (w)     This lock can only be set by wizards.
  locked     (+)     This lock can only be set by the owner of the lock.

& @log
  @log[/<switch>] <message>

  This wizard-only command puts <message> in a log file, tagged with
  the time and object executing the command.  The available switches
  are /check, /cmd, /conn, /err, /trace, and /wiz, specifying which
  file to log to.  /cmd is default.

  See also: @logwipe
& @logwipe
  @logwipe/<switch> <password>

  This God-only command erases one of the MUSH logs. Available switches
  are /check, /cmd, /conn, /trace, and /wiz. God must give the 
  log wipe password from the MUSH's configuration file to use this
  command.

  See also: @log
& @map
  @map[/delim] [<delim>] <list> = <function or pattern>
 
  This command takes a space-separated list of words, and performs
  pronoun/pattern substitution on each word, returning a list - 
  "mapping" the function onto each item in the list. It returns the
  list in a MAPLIST attribute, automatically set on the object executing
  the @map. The set is always performed before any actions further
  actions are executed. 
  
  If the /delim switch is given, the first character of the list is
  used as the delimiter, instead of space.

  Brackets are generally necessary in order to make the function
  substitutions evaluate correctly.
  
  @map is an obsolete command provided for backwards compatibility;
  the ITER() or MAP() functions should probably be used instead.
 
  See "help @map2" for examples of @map.
 
& @map2
 
  Examples of @map:
    @map foobar baz blech=[strlen(##)]
      Returns "6 3 5" in MAPLIST.
    @map testing map-test=[strlen(before(##, est)]
      Returns "1 5" in MAPLIST
    @map Joe Bob Ann=I know ##.
      Returns "I know Joe. I know Bob. I know Ann." in MAPLIST
 
  >  @va Object=$test * * *:@map %0 %1 %2=[strlen(##)];
           @dolist [v(maplist)] = say ##
  Object - Set.
  >  test aaa bb c
  Object says, "3"
  Object says, "2"
  Object says, "1"
& @motd
  @motd [/<switch>] [<message>].  
 
  The default for this command (and with the /connect) switch, is a
  wizard only command that will set a temporary message that 
  will be shown to players when they connect. This MOTD is cleared
  every time the MUSH restarts.

  Note that @motd by itself clears the message. Use @motd/list or
  @listmotd to see the current messages.
 
  Other switches:
  /wizard : sets the message for wizards (like @wizmotd)
  /down   : sets the logins-off message (like @rejectmotd)
  /full   : sets the max-players-logged-in message
  /list   : list the MOTDs (like @listmotd, can be used by anyone)
& @move
  @move <object> = <movement message>

  This sets the message that is shown to <object> whenever it moves.
  Example:
       @move me=You moved! You are now in the room: [name(loc(me))].

See also: go, @omove, @oxmove, @amove
& @name
  @name <object>=<new name> [<password>]

  Changes the name of <object>, which can be a thing, player, exit,
  or room. You can refer to object by name, DBREF number, or as "me"
  or "here". For a player, it requires the player's password.

& @newpassword
  @newpassword <player> = <password>

  This wizard-only command changes <player>'s password. If <player>
  is logged in, s/he will be informed that the password was changed.

See also: @password
& @notify
  @notify[/any][/all] <object>[/<attribute>][=<count>]
  
  This command notifies a semaphore, allowing commands queued for
  that semaphore to be executed.

  If the /any switch is given, then all semaphores associated with
  <object> are @notified.  Otherwise, the only the specified semaphore
  attribute (or SEMAPHORE if no attribute is specified) is @notified.

  If the /all switch is given, then all queue entries associated
  with the selected semaphore(s) are executed.  Otherwise, only the
  first <number> of queue entries are run.  If no <number> is given,
  then only one queue entry is run.

  If the /all switch was not used, and there were not enough queue
  entries waiting to satisfy the requested <number> (or 1, if no
  number was given), then subsequent @waits will not block until
  the requested <number> have been run.
  
  You may not specify both the /any switch and a specific attribute.
  Similarly, you may not specify both the /all switch and a number.

See also: SEMAPHORES, @drain, @wait
& @nspemit
  @nspemit[/switches] <object>=<message>

  This wizard-only command is similar to @pemit, with two differences.
  It will not include nospoof information, and it doesn't accept the
  /contents switch. It is meant to be used by commands in the master
  room where the nospoof information is just useless noise.

See also: @pemit, nspemit()
& @odeath
  @odeath <player> [=<message>]

  This sets the ODEATH attribute on the player, which contains the
  message that will be shown to others when s/he is killed. The
  @odeath message will automatically have the player's name included.

Example:
     @odeath me=falls to the ground and vanishes.
     (if I am killed, others in the room then see:)
     > Cyclonus falls to the ground and vanishes.

  If the =<message> part is omitted, the ODEATH attribute will be reset.

See also: @death, @adeath, kill
& @odescribe
  @odescribe <object> [=<message>]

  This sets the message that will be shown to others whenever anyone
  looks at <object>. The name of the person looking will be added to
  the beginning of the message. Please note that @odescs are often found
  annoying. 

  If the =<message> part is omitted, the message will be reset.

See also: look, @describe, @idescribe
& @odrop
  @odrop <object> [=<message>]

  This sets the message that will be shown to others whenever anyone drops
  <object>. The name of the person dropping the object will be added to the
  beginning of the message automatically.

  If set on an exit, the @odrop is shown in the exit's destination room
  when someone goes through the exit.

  If the =<message> part is omitted, the message will be reset.

See also: drop, @drop, @adrop
& @oefail
  @oefail <object> [= <message>]

  This sets the message that will be show to others whenever anyone tries
  to enter <object> and fails, usually because they fail the enter-lock.

  If the =<message> part is omitted, the message will be reset.

See also: enter, @efail, @aefail, @lock
& @oemit
  @oemit[/noeval] [<room>/]<object> [<object>...] = <message>
 
  This command shows <message> to everyone in the location of <object>
  EXCEPT <object>. The object can be specified by name if in your current
  location, or by DBREF number. A list of objects can be given, in
  which case the message is shown in all locations to all except those
  objects.
  
  If a room is specified (usually via dbref), this command shows
  <message> to everyone in <room> except for <object> (which may be
  a list, as above). In this case, object(s) are matched with reference to
  <room>. Therefore, if you want to send a message to everything but an
  object called "spy" in #100, you can simply use "@oemit #100/spy=Test";
  you don't need to know the dbref of "spy".

  The /noeval switch prevents the MUSH from evaluating the message.
 
See also: @emit, @pemit, NOSPOOF and SPOOFING.
& @oenter
  @oenter <object> [= <message>]

  This sets the message that will be show to others whenever anyone
  enters the object. It will be seen by those already -inside- the
  object and will automatically add the name of the person entering
  at the beginning. If you wish to set a message to be seen by those
  -outside- the object, use @oxenter.

See also: enter, @enter, @oxenter
& @ofailure
  @ofailure <object> [=<message>]

  This sets the message that will be show to others whenever anyone
  fails to pass <object>'s basic lock. For players and things, this means
  failing to pick them up. For exits, this means failing to go through 
  the exit. It automatically prefixes the name of the player.

Example:
  @ofail Locked Door=tries to open the door, but it seems to be locked.

  If the =<message> part is omitted, the message will be reset.

See also: FAILURE, @lock, @failure, @afailure
& @ofollow
  @ofollow <object> [= <message>]

  Sets the message shown to others in the room after someone
  begins following the object (using the 'follow' command). 
  Similar to @omove or @osucc, this command prepends the name
  of the person doing the following.

  If the =<message> part is omitted, the message will be reset.

Ex: @ofollow me=falls into step behind Cyclonus.

See also: follow, unfollow, followers(), @follow, @afollow
& @ounfollow
  @ounfollow <object> [= <message>]

  Sets the message shown to others in the room after someone
  stops following the object (using the 'unfollow' command). 
  Similar to @omove or @osucc, this command prepends the name
  of the person doing the unfollowing.

  If the =<message> part is omitted, the message will be reset.

Ex: @ounfollow me=stops following [name(me)].

See also: follow, unfollow, followers(), @unfollow, @aunfollow
& @oleave
  @oleave <object> [= <message>]
  
  This sets the message that will be displayed to the people inside
  <object> whenever someone leaves <object>. If you want to set a 
  message to be displayed to people outside the object, use @oxleave.
  This command automatically inserts the name of the person leaving
  at the start of the message.

  If the =<message> part is omitted, the message will be reset.

See also: leave, @leave, @aleave, @oxleave
& @olfail
  @olfail <object> [= <message>]
  
  This sets the message that will be shown to others whenever someone
  tries to leave <object> and fails (usually if the person fails the
  leave-lock, or if <object> is set NO_LEAVE). It automatically inserts
  the name of the person trying to leave at the start of the message.

  If the =<message> part is omitted, the message will be reset.

See also: leave, @lfail, @alfail, @lock
& @omove
  @omove <object> [= <message>]

  Sets the message that will be shown to others whenever <object> moves.
  It is shown in the destination room or object and automatically inserts
  the name of the <object> at the beginning. Please note that long @omoves
  are frequently found annoying.

Example:
 @omove me=stalks into the room wearing the latest in malevolent expressions.
  
  If the =<message> part is omitted, the message will be reset.

See also: go, @move, @amove, @oxmove
& @oxmove
  @oxmove <object> [= <message>]

  Sets the message shown to others in the source room whenever <object> 
  moves elsewhere. <object>'s name is automatically inserted at the
  beginning of this message. Note that long @oxmoves are annoying.

 Example:
  @oxmove me=stalks away, glaring.

  If the =<message> is omitted, the message is cleared.
  
See also: go, @move, @omove, @amove
& @opayment
  @opayment <object> [=<message>]

  Sets the message that will be show to others whenever someone "pays"
  <object> (by giving the object a certain amount of MUSH money). The
  name of the person giving the money will be automatically inserted at
  the beginning of the message.
  
  If the =<message> part is omitted, the message will be reset.

Ex: @opay Vending Machine=sticks a quarter in the vending machine.

See also: give, @cost, @payment, @apayment, MONEY
& @open
  @open <exit name>
  @open <exit name>;<exit aliases>=<destination>
  @open <exit name>;<exit aliases>=<destination>,<exit name>;<exit aliases>

  This command opens an exit in the room you are standing in with the 
  specified name. You can then use the @link command to set the exit's
  destination, or you can set it automatically by using the DBREF of a
  destination, which can be a room or object. (Note that you CANNOT open
  exits from objects.) If you also include the second exit name, an exit
  from the destination room will be opened back to the room you are in.

  NOTE: you can have as many exit aliases as you like by adding more,
  separated by semicolons. An exit alias allows you to type that instead of 
  the full exit name to go through the exit. Only the exit name appears in
  the list of Obvious Exits in a room.

Ex: @open Up;u;climb = #255, Down;dow;do;d;fall

See also: EXITS, @link, @dig
& @osuccess
  @osuccess <object> [=<message>]

  Sets the message that is shown to others whenever someone passes the 
  object's Basic lock. For players and things, this means picking them up.
  For exits, this means going through the exit, and the osuccess message
  is shown to those in the room the player has just left. This message 
  automatically inserts the name of the person at the beginning.

  @osucc's are very useful for allowing people to follow someone around
  if the name of the exit is included in the message. It is recommended 
  that you put @osuccs on all exits and all takeable objects.

Ex: @osucc North=heads north into the catacombs.
  
  If the =<message> part is omitted, the message will be reset.

See also: take, @success, @asuccess, @lock, FAILURE
& @otport
  @otport <object> [=<message>]

  Sets the <message>, which will be prefixed by <object>'s name,
  that will be shown to the others in the room that the <object>
  is teleported to. If you want to set a message that will be shown
  to the room that the object is teleported OUT of, use @oxtport.

  If the =<message> part is omitted, the message will be reset.

See also: @teleport, @oxtport
& @ouse
  @ouse <object> [=<message>]

  Sets the message that will be shown to others whenever someone successfully
  uses <object>. The name of the person using the object will automatically
  be inserted at the beginning.

  If the =<message> part is omitted, the message will be reset.

See also: use, @use, @ause, @charges, @runout
& @oxenter
  @oxenter <object> [= <message>]

  Sets the message that will be shown to others outside the object whenever
  someone enters the object. The name of the person entering will be
  inserted at the beginning of the message automatically. If you want
  to show a message to everyone inside the object, use @oenter.

  If the =<message> part is omitted, the message will be reset.

See also: enter, @oenter, leave
& @oxleave
  @oxleave <object> [= <message>]

  This message is shown to everyone in the room that a person enters
  when doing a 'leave' command.  This will be shown in addition to the
  enter messages of the room, not instead of.

  If the =<message> part is omitted, the message will be reset.

See also:
& @oxtport
  @oxtport <object> [=<message>]
  
  Sets the <message>, which will be prefixed by <object>'s name,
  that will be shown to those in the room that the object has
  left via @teleport. If you want to show a message to the room the
  object has arrived in, use @otport.

  If the =<message> part is omitted, the message will be reset.

See also: @teleport, @otport, @atport
& @parent
  @parent <object> = <parent>
 
  This command sets the parent of <object> to <parent>. <parent> may be
  an object of any type; <object> can be anything but a player. The
  player must control <object>. <parent> must be controlled by the
  player or LINK_OK.
  If <parent> is "none" or blank, the object is unparented.

See also: PARENTS, parent(), lparent()
& @password
  @password <old password>=<new password>

  This changes your password. Please note that passwords ARE case-sensitive.
  
& @payment
  @payment <object> [=<message>]

  Sets the message that is shown to anyone who pays the object, by giving
  it a certain amount of MUSH money. If =<message> is omitted, the message
  is reset to nothing. May be abbreviated @pay. 

See also: give, @apay, @opay, and @cost.
& @receive
& @oreceive
& @areceive
  @receive <recipient> [=<message>]
  @oreceive <recipient> [=<message>]
  @areceive <recipient> [=<message>]

  @receive sets the message that is shown to the recipient who 
  acquires an object by 'get'ing it or having it 'give'n to them.
  @oreceive is a message shown to others in the recipient's location,
  and @areceive is an action run by the recipient. If not set,
  the recipient gets a default message ("Jane gave you A Headache").
  
  %0 will be set to the dbref of the object received.
  %1 will be set to the dbref of the giver if a 'give' was performed.

See also: give
& @give
& @ogive
& @agive
  @give <giver> [=<message>]
  @ogive <giver> [=<message>]
  @agive <giver> [=<message>]

  @give sets the message that is shown to the giver when giving an object
  to someone else.  @ogive is a message shown to others in the giver's
  location, and @agive is an action run by the giver. If not set,
  the giver gets a default message.

  %0 will be set to the dbref of the object given.
  %1 will be set to the dbref of the recipient.

See also: give
& @pcreate
  @pcreate <name> = <password>

  This wizard-only command creates a player with the given name and
  password.
& @pemit
  @pemit[/<switch>] <object> = <message>
  
  The basic form of this command sends <message> to <object> directly.
  It is very similar in its effects to @emit except only one object
  will see the message. You may @pemit to objects in the same room,
  objects you are carrying, and to objects that are carrying you, 
  or @pemit remotely, using #<object> or *<player name>.
 
  The /list switch to this command allows you to @pemit a message to
  a list:  @pemit/list <object 1> [<object 2> <object N>] = <message>
  There can be any number of objects in the list. The objects must be
  specified by dbref number. You will not get back a "confirmation"
  message for the /list form of this command. 

(continued in help @pemit2)
& @pemit2
  The @pemit command can take the following additional switches:
    /contents  -- equivalent to @remit.
    /silent    -- does not tell the @pemit'ing object a confirmation message.
    /noisy     -- tells the @pemit'ing object a confirmation message.
    /noeval    -- the message will not be evaluated for substitutions 

  Note that page-lock and the HAVEN flag will block @pemits as well, 
  except from Wizards or those with the pemit_all power.

See also @emit, @oemit, @remit, NOSPOOF, and SPOOFING.
& @poll
  @poll <poll question>
  This wizard-only command sets the "poll" - the Doing question. If
  "@poll" is used by itself, the question is reset to the default
  string "Doing". It can also be used by those with the poll @power.

See also: @doing, WHO, DOING
& @poor
  @poor <value>.
  This is a wizard only command.  It sets every player's money supply to
  value.

See also: MONEY
& @power
  @power <object>=[!]<power>
  
  This is a wizard-only command which allows the granting of special
  privileges to objects of any type. 
  
  A list of powers is given in "help powers list".
& @prefix
  @prefix <object> = <message>
 
  This attribute is meant to be used in conjunction with the AUDIBLE
  flag. The @prefix of the object is prepended to messages propagated
  via AUDIBLE.   Pronoun substitution is done on @prefix messages.
  
  For example, if you have an audible exit "Outside" leading from a room 
  Garden to a room Street, with @prefix  "From the garden nearby,"  if
  Joe does a ":waves to everyone." from the Garden, the people at Street
  will see the message,   "From the garden nearby, Joe waves to everyone."

See also: @inprefix, AUDIBLE, @listen
& @ps
  @ps[/<switch>] [*<player> | all]
  
  @ps is a useful command for MUSHers.  It lists all commands currently on
  your 'to be executed' queue, thus allowing you to identify infinite (or
  unnecessary) loops with-out putting in says or poses. It gives a count of
  the total commands in each of the queues (Player, Object, Wait, and
  Semaphore), displayed in the format:
      <Number of your queued commands> / <Total number of queued commands>.
      
  @ps with no arguments will show you your own queue. Wizards may specify
  the /all switch, and see the full queue. They may also specify a player.
  @ps/summary just displays the queue totals for the whole queue.
  @ps/quick displays the queue totals for just your queue.
& @purge
  @purge is a wizard only command that calls the internal purge routine to 
  advance the clock of each object scheduled to be destroyed, and destroy 
  those things whose time is up. The internal purge routine is normally
  run automatically approximately every 10 minutes. 

  The @purge command should almost never need to be performed
  manually. If you do use it manually, you may want to use it twice in
  a row to make sure that everything marked GOING is actually
  destroyed.

See also: @dbck
& @quota
  @quota [/<switch>] [<victim>]

  This command is only available if the quota system is enabled.
  It reports the victim's owned objects and the maximum number of objects 
  s/he may own. You must be a Wizard to see another player's quota.

  The /set and /all switches are equivalent to @squota and @allquota,
  respectively.
& @readcache
  @readcache
  
  This wizard-only command reads special text files into a cache and
  rebuilds the help and news indices. This must be done every time the
  text files (connect text, help files, etc.) are changed while the
  game is running. It does not need to be used after changing the
  names.cnf file of bad player names.
 
  A site admin can achieve the same effect by sending the MUSH process
  a kill -1 or kill -HUP.
 
& @rejectmotd
  @rejectmotd <message>

  This is a wizard only command that will set a short (non-longterm) message 
  that will be shown to players that try to connect when logins are disabled. 
  This is the "Down MOTD" in the @listmotd listing. The siteadmin can set a
  more permanent message for this by editing the file "down.txt".
  
See also: @motd, @list, @listmotd
& @remit
  @remit[/switches] <object> = <message>.

  Sends the message to all contents of <object>, which can be a room,
  thing, or player. (The TinyMUSH equivalent is @pemit/contents).

  The /silent switch stops the remitter from getting feedback if they're
   in a different location than the target.
  The /noisy switch always gives feedback to the remitter if they are
   not in the target location. Without /silent or /noisy, the silent_pemit
   config option is used to determine noisiness.
  The /list switch will send the message to the contents of multiple
   objects at the same time. The <OBJECT> argument is treated as a
   space-separated list of targets.

See also: @emit, @pemit, @oemit, SPOOFING, NOSPOOF and CONTROL.
& @restart
  @restart <object> or @restart/all
  
  This command halts <object> (as described in @halt), and then triggers
  the STARTUP attribute on the object, if set. If <object> is a player,
  it affects the player and all of their objects. Players can use
  @restart me to restart their own objects. The /all switch halts
  all objects (see @allhalt) and restarts them, and can only be used
  by a wizard.


See also: @halt, @startup
& @runout 
  @runout <object> = <action list> 

  Sets the actions to be taken when the charges of the object reaches
  zero. 

See also: @charges, use, ACTION LISTS
& @rwall
  @rwall <message>

  Only wizards and royalty may use this command. It broadcasts a message to
  all connected wizards and royals, prefixed with "Admin:". If the first
  character is : or ; it does the same thing as @rwallpose.
& @rwallemit
  @rwallemit <message>
  Only wizards and royalty may use this command. It is similar to @wizemit,
  but broadcasts the message to all connected wizards and royals.
& @rwallpose
  @rwallpose <pose>
  Only wizards and royalty may use this command. It's a variant of @rwall,
  using a pose, and is identical to "@rwall :<pose>"
& @scan
  @scan[/<switch>] <command>
  
  @scan gives you a list of all objects containing $commands (user-defined
  commands) which could match <command>. If given no switches, it checks
  you, your possessions, your location, objects in your location, the
  zone/zone master room of your location, your zone, and objects in the 
  master room. It does NOT stop when it gets a match, but rather, finds all 
  possible matches. It also tells how many commands on each object were
  matched, and what attributes they are in. It does NOT scan objects
  that you do not control and are not set VISUAL.
  
  This command can take four switches:
     /room     --   just matches on your location and objects in it.
     /self     --   just matches on you and anything you're carrying.
     /zone     --   just matches on zones of your location and yourself.
     /globals  --   just matches on objects in the master room.
& @search
  @search [<player>] [<class>=<restriction>] [,<begin>,<end>]
  
  This command searches the database and lists objects which meet user
  specified search criteria.  You can limit the scope of the search by
  specifying <begin> and <end> as the first and last dbrefs to search.
  
  If a <player> argument is supplied, only objects owned by that player
  will be listed. If a <class> argument is supplied only objects of a
  certain class will  be listed. Possible <class>es include TYPE, NAME,
  ZONE, PARENT, EXITS, OBJECTS (Or THINGS), ROOMS, PLAYERS, FLAGS, POWERS,
  EVAL, EPLAYER, EROOM, EEXIT, and EOBJECT (Or ETHING).

  If <class>=TYPE, possible <restriction>s include OBJECT (Or THING), ROOM,
  EXIT, PLAYER. This shows all objects of the specified type.
  
  If <class>=NAME, only objects whose name begin with the string <restriction>
  will be listed. If <class>=ZONE, only objects in the zone <restriction>
  will be listed. If <class>=PARENT, only children of parent <restriction>
  will be listed. For ZONE and PARENT, <restriction> must be specified as a
  dbref number.
  
  'help @search2' for more.
& @search2
  If <class>=EXITS, OBJECTS, ROOMS, or PLAYERS, only objects of that type
  
  If <class>=FLAGS, only  objects with the list of flags specified by 
  <restriction> will be listed. Flag names should be specified by single
  letters. Flag names are case-sensitive.
  
  If <class>=POWERS, only objects with the given power are listed. Only
  one power may be specified.
  
  If <class>=EVAL, only objects for which <restriction> evaluates to a
  true boolean value will be listed. The token '##' in <restriction>, which
  is a function, is replaced by each dbref sequentially. Classes EPLAYER,
  EROOM, EEXIT, and EOBJECT work like EVAL but are restricted to a single type.
  
  See "help @search3" for more.
& @search3
  For the class TYPE=PLAYER, and for  PLAYER=<player-name>, anyone may
  obtain information on any player.  In all other cases, only wizards may
  obtain information about other players. This is computationally
  expensive, costing 100 pennies. It is generally faster than @find.
  
  Examples:  
    @search flags=Wc      <-- search for connected wizards.
    @search type=room     <-- list all rooms owned by me.
    @search zone=#50      <-- list all objects belong to zone #50.
    @search Joe eval=1,100,200   <-- list objects from #100-#200 owned by Joe.
    @search eval=gt(money(##),10)     <-- list all objects owned by me  
                                          worth more than 10 coins.

& @select
  @select[/notify] <string>=<expr1>,<action1>[,<exprN>,<actionN>]...[,<default>]
  This is similar to @switch, except it only executes the action
  associated with the first expression which matches <string> - the
  targets are mutually exclusive. If no target is matched, the default
  actions are executed. This is equivalent to "@switch/first".

  Example:
    &FOO thing = $foo *:@select %0=*a*,:acks,*b*,:bars,*c*,:cheeps,:glurps
    foo abc
    > thing acks
    foo xxx
    > thing glurps

  The string "#$" in <action>'s will be expanded to the evaluated result
  of <string> before it is acted on.

  If the /notify switch is given, a "@notify me" is queued after 
  the selected <action>. This is useful for synchronization with semaphores.

See also: @switch, switch()
& @set
  @set <object>=[!]<flag>
  @<pre-defined attribute> <object>=<value>
  @set <object>=<attribute>:<value>
  @set <object>/<attribute>=[!]<atrflag>
  
  The first form sets (or unsets) a flag on <object>. See 'help flags'.
    Ex: @set me=VISUAL
  Flags may be specified by full name (recommended) or by flag character.

  The second form sets a pre-defined attribute on <object>
    Ex: @fail Heavy Box=You can't pick that up.

  The third form sets an arbitrary attribute with <value> on <object>.
  You can also do this with &<attribute> <object>=<value>
    Ex: @set Test Object=random:This is a random attribute.
        &random Test Object=This is a random attribute.
  
  The fourth form sets (or unsets) an attribute flag on the specified
  attribute. See 'help attribute flags'.
& attribute flags
  Attribute flags are set on an object's attributes using @set, or applied
  to attributes globally using @attrib. Their names (and, when applicable,
  the character used in examine as shorthand for the flag) include:
 
  no_command ($)    Attribute will not be checked for '$' commands and
                    '^' listen patterns. 
  visual (v)        Attribute can be seen by anyone via get(), eval(),
                    ufun(), zfun(), and similar functions. 
  no_inherit (i)    Attribute will not be inherited by the children of
                    this object. 
  no_clone (c)      Attribute will not be copied if the object is @clone'd.
  regexp (R)        Match $-commands and ^-listens using regular expressions.
                    See 'help regexps'.
  case (C)          Match $-commands and ^-listens case sensitively.
  safe (S)          Attribute may not be modified, without unsetting this flag.
  mortal_dark (m)   Attribute cannot be seen by mortals. This flag can only 
                    be set by royalty and wizards.  "hidden" is a synonym.
  wizard (w)        Attribute can only be set by wizards. 
                    This flag can only be set by royalty and wizards.
  prefixmatch       When a user attempts to set an attribute using @<attrib>,
                    this attribute will be matched down to its unique
                    prefixes. This flag is primarily used internally.
& @sex
  @sex <player> = <gender>  

  You can use this command to set yourself or any of your objects to be
  male, female, neuter, or plural. The SEX attribute is used for pronoun 
  substitution by the MUSH, and anything not recognizable will be treated
  as neuter. 

  @sex me = Male
  @sex me = Female
  @sex me = Woman
  @sex me = They
  @sex me = Plural
  @sex me = No thank you (silly, but possible)

See also: GENDER, SUBSTITUTION
& @shutdown
  @shutdown[/panic][/reboot][/paranoid]

  @shutdown shuts down the game. It may only be used by Wizards and
  must be typed in full.

  @shutdown/panic performs a panic shutdown of the game, using a seperate
  database file, not the normal one. It may only be used by God.

  @shutdown/reboot restarts the game without disconnecting the users.

  If the /paranoid switch is added, the shutdown dump will be a paranoid
  dump (see @dump).
& @sitelock
  @sitelock
  @sitelock/name <name>
  @sitelock <host-pattern> = <options>[,<name>]
  @sitelock[/<ban|register>] <host-pattern>
  @sitelock/remove <string>

  The @sitelock command adds rules to the access.cnf file, controlling
  a host's level of access to the MUSH, or adds banned player names to
  the names.cnf file. Only Wizards may use @sitelock.

  @sitelock without arguments lists all sites in access.cnf.
  Rules are processed in the order listed, and the first matching
  rule is applied.

  @sitelock/name adds a name to the list of banned player names.
  Use !<name> to remove a name from the list.

  @sitelock <host-pattern> = <options>[,<name>] controls the access options
  for hosts which match <host-pattern>, which may include wildcard
  characters "*" and "?". See help @sitelock2 for the list of options,
  and help @sitelock3 for an explanation about the name argument.

  For backward compatibility, @sitelock/ban is shorthand for
  setting options "!connect !create !guest", and @sitelock/register
  is shorthand for options "!create".

& @sitelock2

  Sitelock allow/deny options:
   connect   --  allow this site to connect to non-guest players
   !connect  --  don't allow this site to connect to non-guest players
   guest     --  allow this site to connect to guest players
   !guest    --  don't allow this site to connect to guest players
   create    --  allow this site to create players
   !create   --  don't allow this site to create players
   default   --  allow any of the above
   none      --  don't allow any of the above
   !god      --  God can't connect from this site.
   !wizard   --  Wizards can't connect from this site.
   !admin    --  Wizards and Royalty can't connect from this site.

  Allow/deny options not set are assumed to be allowed.

  Sitelock special options:
   register    -- allow this site to use 'register <name> <email>'
                  at the connection screen to register players.
                  Players will be emailed their character's password.
                  This should be used with !create to be effective.
   suspect     -- set all players who connect from this site SUSPECT.
   deny_silent -- don't log failed access attempts from this site.
   regexp      -- Treat the hostname pattern as a regular expression
                  instead of a wildcard pattern.
& @sitelock3
 If you specify a character name after the options, the options
 are only checked if the host pattern matches, AND the character
 being checked for connect support matches the one you gave.
 Use it only with connect and !connect options, since they're
 the only ones where an existing character is used.

 For example, to disallow anyone from connecting to 'Twink' from
 one domain, but to allow connections to the character from others,
 use something like:

 @sitelock *.somesite.com=!connect,Twink

 If you want to disallow connections to a character from anywhere,
 use @newpassword or @sitelock *=!connect,Twink.

  @sitelock/remove will delete entries that were added with @sitelock
  if their host-pattern matches <string> exactly.
 
& @squota
  @squota <victim> [= [+|-] <amount>]

  This is a wizard level command that is only available if the quota
  system is enabled.  It reports the victim's owned objects, and sets
  the maximum number of objects s/he may own to <amount>. If no limit is
  specified, this shows current quota, and reminds you to set one.
  Using + or - you can add <amount> to the limit, or subtract it.
& @startup
  @startup <object> = <action list>

  Sets the list of actions on <object> that will happen whenever the MUSH
  is restarted. This lets you start up objects that need to be running 
  continuously. It is also useful for use with @function. 
  
See also: @function, ACTION LISTS
& @stats
  @stats [<player>]
  @stats/table

  In its first form, display the number of objects in the game broken
  down by object types.  Wizards can supply a player name to count only
  objects owned by that player.

  In its second form, display statistics on internal tables.
& @success
  @success <object> [=<message>]. 

  Sets the message that is shown to someone who successfully passes
  the basic lock of <object>. For things and players, this means picking
  them up. For exits, this means going through the exit.

  Ex.: @succ Box=You pick up the box.
       @succ Door=You walk through the door.

See also: @osuccess, @asuccess
& @sweep
  @sweep [connected | here | inventory | exits ]
 
  @sweep gives you a list of all objects/players that are listening in
  the room you are currently in, as well as the objects you are
  carrying. Most objects only listen for a particular string or
  phrase, so they normally do not pose a problem if you need privacy.
  You will have to be careful of players and puppets since they will
  hear everything you say and do. (And might post the same to r.g.m!)
  AUDIBLE exits are also shown on an ordinary sweep, if the room is
  also AUDIBLE. (Audible exits aren't active unless the room is audible).
 
  The four command options can also be used as switches (i.e., you
  can use "@sweep/connected" instead of "@sweep connected"). 
  If the connected flag is given, only connected players and puppets
  owned by connected players will be shown in the @sweep.
  The "here" and "inventory" flags check only your location or
  inventory, respectively. "exits" only checks for AUDIBLE exits.
& @switch
  @switch [/<switch>] <string> = <expr1>, <action1> [,<exprN>, 
                                 <actionN>]... [,<default>]
  For those of you familiar with programming, this command acts like
  if/then/else or switch/case. It compares <string> against whatever
  each <expr> evaluates to. If <string> and <expr> match, the action list
  associated with that <expr> is carried out. If no match is found, the
  <default> action list is carried out. 

  The string "#$" in <action>'s will be expanded to the evaluated result
  of <string> before it is acted on.
  
  @switch/all   will carry out the action lists for -all- of the 
                expressions that match <string>. This is the default.
  @switch/first will carry out the action list for only the -first-
                expression that matches <string>. This is the same as
                @select, and it is less computationally expensive than 
                /all in many cases.
  @switch/notify will cause a "@notify me" to be queued after 
                the selected <action>. 

(continued in help @switch2)
& @switch2
Examples: 
    &SWITCH_EX thing = $foo *:@switch %0=*a*,:acks,*b*,:bars,:glurps
    foo abc
    > thing acks
    > thing bars
    foo xxx
    > thing glurps

    &SWITCH_EX thing = $foo *:@switch/first %0=*a*,:acks,*b*,:bars,:glurps
    foo abc
    > thing acks

    &SWITCH_EX thing = $test:@switch hasflag(%#,PUPPET)=1,"Puppet!,"Not Puppet!
    test
    > thing says, "Not Puppet!"
See also: switch wildcards, @select, switch()
& @teleport
  @teleport[/silent] [<object>=] <room>. 

  Teleports <object> to <room>.  <object> must be a thing; if you do not
  supply a thing, the object is assumed to be yourself. The destination
  must be either JUMP_OK or controlled by you, and you must either
  control <object> or <object>'s current location. Also, the destination,
  if a room, cannot be teleport-locked against <object>. Mortals cannot
  teleport Royalty or Wizards. If the target room has a drop-to, <object>
  will go to the drop-to room instead. Wizards can teleport things into
  players' inventories.

  Teleportation from a room can be stopped by setting the NO_TEL flag.
  Royalty and Wizards can _always_ teleport to any location, regardless
  of NO_TEL or teleport locks.

  Teleportation triggers the @oxtport/@tport/@otport/@atport attributes,
  unless <room> is an exit or the /silent switch is given.

  As a special case, using "home" as the <room> teleports the object
  to its home.

  See also: JUMP_OK, NO_TEL, @oxtport, @tport, @otport, @atport, @lock
& @tport
  @tport <object> [=<message>]

  Sets the <message> shown to <object> when <object> is teleported.
& @trigger
  @trigger <object>/<attribute> [=<value 0>,<val. 1>,...,<val 9>]

  @trigger can be used to set off commands stored in an attribute on 
  an object. It can also pass values to that attribute on the stack 
  as %0 - %9.

  Example:
    &GREET me=POSE waves hi.
    @tr me/GREET
    > Cyclonus waves hi.

    &GREET me=POSE waves to %0! ; say Hi there, %1.
    @trig me/GREET = Gears, Arcee
    > Cyclonus waves to Gears.
    > You say, "Hi there, Arcee."

(continued in help @trigger2)
& @trigger2
  @trigger is very useful for splitting up large commands and for making
  them neater, but it does cause a time delay in execution, because the 
  commands are put into the queue a second later. For very commonly-used
  globals that you want to execute quickly, you should probably avoid using 
  @trigger. However, in most cases, the time saved by cramming everything 
  into one attribute is outweighed by the time spent debugging.

& @ulock
  @ulock <object> = <key>

  This is an abbreviation of @lock/use.

  This lock determines who is allowed to "use" the object or to set off
  any of the $-commands on the object. 

  Example: if I want everyone but Bob to be able to use my toy, I would
  "@ulock toy=!*Bob". If I want only Bob to be able to use it, I would
  "@ulock toy=*Bob".

See also: @lock, locktypes
& @uptime
  @uptime[/mortal]
  
  This command, for mortals, gives the time until the next database dump.
  For wizards, it also gives the system uptime (just as if 'uptime' had
  been typed at the shell prompt) and process statistics, some of which
  are explained in the next help entry.
  Wizards can use the /mortal switch to avoid seeing the extra process
  statistics.

  Continued in HELP @UPTIME2
& @UPTIME2
  While the exact statistics displayed depends on the operating system
  of the game's server, typical things might include the process ID,
  the machine page size, the maximum resident set size utilized (in K),
  "integral" memory (in K x seconds-of-execution), the number of page 
  faults ("hard" ones require I/O activity, "soft" ones do not), the
  number of times the process was "swapped" out of main memory, the
  number of times the process had to perform disk I/O, the number of
  network packets sent and received, the number of context switches,
  and the number of signals delivered to the process.

  Under Linux, memory usage is split into a number of different categories
  including shared libraries, resident set size, stack size, and some 
  other figures. Also under linux, more information on signals is printed.
& @unlink
  @unlink <exit>
  @unlink <room>

  The first form of this command unlinks an exit from its destination
  room. Unlinked exits may be picked up and dropped elsewhere or relinked
  by anyone else. (Note that relinking an unlinked exit will @chown it to
  you if you do not already own it.)

  The second form removes the DROP-TO on the room.

See also: @link, DROP-TO
& @unlock
  @unlock[/<switch>] <object>

  Removes the lock on <object>. It can take as many switches as @lock can. 

See also: @lock, locktypes
& @use
  @use <object> [=<message>]

  Sets the message that is displayed to someone who successfully uses 
  <object>. If =<message> is omitted, the message is reset to nothing.

See also: use, @ouse, @ause, @charges, @runout
& @uunlock
  @uunlock <object> = <key>

  Un-use-locks the object. See also: @lock, @ulock
& @version
  @version
  Tells the player the name of the MUSH, which version of the code is 
  currently running on the system, when it was compiled, and when
  the last restart was.
& @verb
  @verb <victim>=<actor>,<what>,<whatd>,<owhat>,<owhatd>,<awhat>,<args>
  
  This command provides a way to do user-defined verbs with associated
  @attr/@oattr/@aattr groups. Invoking it does the following:
  
  <actor> sees the contents of <victim>'s <what> attribute, or
    <whatd> if <victim> doesn't have a <what>.
  Everyone in the same room as <actor> sees the contents of
    <victim>'s <owhat> attribute, with <actor>'s name prepended,
    or <owhatd>, also with <actor>'s name prepended, if <victim>
    doesn't have an <owhat>.
  <victim> executes the contents of his <awhat> attribute.
  
  By supplying up to ten <args>, you may pass those values on
  the stack (i.e. %0, %1, %2, etc. up through %9).
  
  See "help @verb2" for more.
  
& @verb2  
  In order to use this command, at least one of the following criterion
  must apply:
    1. The object which did the @verb is a wizard.
    2. The object which did the @verb controls both <actor> and <victim>
    3. The thing which triggered the @verb (such as through a $command on
       the object which did the @verb) must be <actor>, AND the object
       which did the @verb must be either privileged or control <victim>
       or <victim> must be VISUAL.
  
  See "help @verb3" for examples.
  
& @verb3
  Example:
  
  &VERB_EXAMPLE Test Object=$test:@verb me=%#,TEST,You just tested.,OTEST,
       just tested the example.,ATEST,%N
  test
  > You just tested.
  > [others see] Cyclonus just tested the example.

  &TEST Test Object=You have just tested this object!
  &ATEST Test Object=@emit %0 has failed!
  &OTEST Test Object=tests test object.
  test
  > You have just tested this object!
  > [others see] Cyclonus tests test object.
  > Cyclonus has failed!

  Another example follows in "help @verb4"
& @verb4
  In order to make this into a global command that anyone can use, we
  need to put it on a WIZARD object in the Master Room. 

  &DO_TEST Global=$test *:@select locate(%#,%0)=#-1,
                  {@pemit %#=I don't see that here.},
                  {@verb locate(%#,%0,n)=%#,
                   TEST,You test [capstr(%0)].,
                   OTEST,tests [capstr(%0)].,
                   ATEST}
 
  &TEST Example=You test this fun example.
  &ATEST Example=POSE has been tested!
  test example
  > You test this fun example.
  > [others see] You test Example.
  > Example has been tested!

See also: USER-DEFINED COMMANDS, STACK, @trigger, @select
& @wait
  @wait[/until] <time> = <command_list>
  @wait <object> = <command_list>
  @wait[/until] <object>/<time> = <command_list>
  
  The basic form of this command puts the command list (a semicolon-separated 
  list of commands) into the wait queue to execute in <time> seconds. If the
  /until switch is given, the time is taken to be an absolute value in seconds,
  not an offset.
  
  The second form sets up a semaphore wait on <object>. The enactor will
  execute <command_list> when <object> is @notified.
  
  The third form combines the first two: the enactor will execute
  <command_list> when <object> is @notified or when <time> passes,
  whichever happens first.
 
  More forms that support semaphores on arbitrary attributes are described in
  help @wait2
  See also the help for: SEMAPHORES, @drain, @notify
& @wait2
  Normally, a semaphore wait depends on the SEMAPHORE attribute of the object
  in question. However, it is useful to be able to use other attributes as
  semaphores, so one object can be used as the blocker for multiple different
  things at once. Possible attribute names aren't completely arbitrary. See
  HELP SEMAPHORES5 for details.

  The syntax for these are:
 
  @wait <object>/<attribute> = <command list>
  @wait[/until] <object>/<attribute>/<time> = <command list>

  You cannot do a non-timed semaphore on an attribute with a numeric name,
  as that is taken as a timeout instead.
& @wall
& @wallemit
& @wallpose
  @wall [/<switch>] <message>
  @wallemit <message>
  @wallpose <pose>

  Only wizards can use this command, which allows the player to shout
  a message to every player connected. It must be typed in full.
  It can also take the following switches:
  /wizard  : broadcast to wizards (like @wizwall)
  /royalty : broadcast to wizards and royalty (like @rwall)
  /pose    : pose a message to all (or use @wallpose)
  /emit    : emit a message to all (or use @wallemit)

  You can also use @wall :<pose> to @wallpose.

See also: @wizwall, @rwall
& @warnings
  @warnings <object|me>=<warning list>

  If the building warning system is enabled, this command will set
  the types of warnings which should be reported on an object or
  to a player. You must control the object to use this command.

  When an object is checked for warnings (via @wcheck by the owner, or
  automatically), only warnings which are set to be reported on the
  object will be reported. If no warnings are set on the object, the
  owner's warning settings will be used. When admin use @wcheck to
  check non-owned objects, their personal warnings are always used.

  For a list of warnings, see 'help warnings list'
  See also 'help @wcheck' and 'help NO_WARN'

  For examples, see 'help @warnings2'

& @warnings2

  Example 1: Normal building situations
  Most people will simply want to leave their @warnings set to "normal"
  and their objects' @warnings set to "none". They will then receive 
  normal warnings for all their objects.

  Example 2: Warning-lover
  People who find warnings very helpful (like heavy builders) may want
  to set their personal @warnings to "extra" or "all", and keep their
  objects' warnings at "none". If a specific object should be treated 
  less strictly, set that object's @warnings differently. If an object
  shouldn't be warned on at all, set the NO_WARN flag on the object.

(continued in help @warnings3)
& @warnings3
  Example 3: Warning-hater
  People who prefer not to be warned except for specific object may
  set their personal @warnings to "none" and set the @warnings on
  those objects to appropriate levels.

  Example 4: I need some peace!
  Players who @set themselves NO_WARN will receive no warnings ever
  until they unset the flag.

& @wcheck
  @wcheck <object>
  @wcheck/all 
  @wcheck/me

  This command is enabled if the building warning system is enabled.

  The first form of the command performs warning checks on a specific
  object. The player must own the object or be see_all. When the owner
  runs the command, the @warnings of the object are used to determine
  which warnings to give. If the object has no @warning's set, the
  @warnings of the owner are used. When a non-owner runs the command,
  the @warnings of the non-owner are used.

  The second form of the command runs @wcheck on every object in the
  database and informs connected owners of warnings. It is usually
  automatically run by the MUSH at intervals. Only Wizards may use
  @wheck/all.

  The third runs it on all objects the player owns that aren't set NO_WARN.

See also: @warnings, WARNINGS, NO_WARN
& @whereis
  @whereis <player>

  If <player> is not set UNFINDABLE, this command will tell you where
  the player is. It will also inform the player that you attempted to
  locate their position, and whether you succeeded or not.

  To avoid being found this way, just do: @set me=UNFINDABLE

  Ex: @whereis  Moonchilde

See also: UNFINDABLE, loc()
& @wipe
  @wipe <object>[/<attribute pattern>]
  
  This command clears attributes from <object>, with the exception of
  attributes changeable only by wizards, and attributes not controlled by
  the object's owner (i.e. locked attributes owned by someone else).
  Only God may use @wipe to clear wiz-changeable-only attributes.
  The SAFE flag protects objects from @wipe.
 
  If no <pattern> is given, this gets rid of all the attributes, with
  exceptions as given above. If <pattern> is given, it gets rid of
  all attributes which match that pattern. Note that the restrictions
  above still apply.
& @wizemit
& @wizwall
& @wizpose
  @wizwall <message>
  @wizemit <message>
  @wizpose <message>

  This wiz-only command works similarly to @rwall or @wall, sending
  a message in either say, pose, or emit format to all wizards who
  are currently logged in. 

  @wizwall :<pose> or @wizwall ;<pose> will also send the message in
  pose format.

See also: @wall, @rwall
& @wizmotd
  @wizmotd <message>

  This is a wizard only command that will set a short temporary message
  that will be shown to all wizards when they connect. It is listed in
  @listmotd as the Wiz MOTD. A more permanent message can be set by
  the siteadmin by editing the file "wiz.txt".
& @zemit
  @zemit <zone> = <message>

  Emits a message to all rooms in <zone>. You must have control in that
  zone in order to use this command. Because it is computationally
  expensive, it costs 100 pennies.
& ahelp
  ahelp [<topic>]

  Shows the current admin help for the MUSH. Only ROYALTY and WIZARDS
  can use this command.

See also: anews
& anews
  anews [<topic>]

  Shows the current admin news for the MUSH. Only ROYALTY and WIZARDS
  can use this command.

See also: ahelp
& brief
  brief <object> 

  This command works like an abbreviated version of examine. It does not
  print out all the attributes on the object. 

See also: examine
& cd
& ch
& cv
  cd <name> <password>
  ch <name> <password>
  cv <name> <password>

  Not really a MUSH command, but a command available at the connect
  screen for Wizards. If enabled, Wizards who use 'cd' instead of
  'connect' to connect will be set DARK as they connect, and will not
  show arrival messages. Their arrival will, however, be broadcast
  to other admin, but not to MONITOR-flagged mortals.

  ch is a variant of cd that allows Royalty to connect @hidden.
  cv is a variant that forces a non-dark, non-hidden connection.

See also: DARK, @hide
& DOING
  DOING

  This command displays the list of players currently connected to the
  MUSH. For mortals, it is identical to WHO. For wizards, it displays
  the WHO in the format mortals see. The wizard WHO shows location and
  host, but does not show @doing messages. DOING shows @doing messages
  but not location or host.

See also: WHO, @poll, @doing
& SESSION
  SESSION

  This admin-only form of WHO includes information on how much text
  has been received and sent to the connections. It has three fields:

  Sent, which is the number of characters sent TO the mush from that
  connection. Recv, the number of characters sent FROM the mush to that
  connection, and Pend, the number of characters still waiting to be sent
  from the mush to the connection.

See also: WHO, DOING
& teach
  teach <command>

  Shows <command> (unparsed) to others in your room and then causes
  you to execute <command> as if you'd typed it in directly from 
  the socket (even if you're an object). Useful for helping newbies:

  > say To do a pose, use :<action>
  You say "To do a pose, use :<action>"
  > teach :waves hello.
  Javelin types --> :waves hello.
  Javelin waves hello.

  > teach "[sort(c b a)]
  Javelin types --> "[sort(c b a)]
  Javelin says, "a b c"

& drop 
  drop <object>

  Drops <object>, if you are presently carrying it. If the room the object
  is dropped in has a DROP-TO set, the object may automatically be sent
  to another location. Some MUSHes may have @lock/drop enabled, which 
  allows you to set who is permitted to drop the object.

  Note that as of 1.6.6, the TEMPLE flag and SACRIFICING have been 
  disabled.

See also: STICKY, DROP-TO
& enter
  enter <object>

  Used to enter a thing or player. You can only enter an object if 
  you own it or if it is set ENTER_OK. You must also pass the enter-lock,
  if it is set. Entering an object triggers is @enter/@oenter/@oxenter
  messages and its @aenter actions. If you fail the enter-lock, the
  object's @efail/@oefail/@aefail messages and actions are triggered.

  Insides of objects are best used for vehicles, or storage spaces
  when you don't have a home. You can describe the interior of an
  object differently from its exterior by using @idescribe.  

See: @enter, @oenter, @oxenter, @aenter, leave, @lock, @idesc, INTERIORS
& events
& rules
  events [<topic>]
  rules [<topic>]

  These commands, like news, work the same way as the help command, except
  that the information provided in them is specific to this particular
  MUSH. Not all MUSHes will have both or either of these commands enabled.

See also: news, help
& examine
  examine[/<switch>] <object>[/<attribute>] 
  
  Displays all available information about <object>.  <object> may be an 
  object, 'me' or 'here'. You must control the object to examine it.  If 
  you do not own the object, or it is not visible, you will just see the 
  name of the object's owner.  May be abbreviated 'ex <object>'.  If the 
  attribute parameter is given, you will only see that attribute (good 
  for looking at code). You can also wild-card match on attributes.  For 
  example. to see all the attributes that began with a 'v' you could do 
  ex <object>/v*
  
  Examine takes three switches, "brief"  (equivalent to the "brief" command),
  "debug", which is a wizard-only switch, and "mortal".  "debug" examine
  will show the raw values for certain fields in an object. "mortal"
  examine will show an object as if you were a mortal and not the object's
  owner. It's primarily useful to admins.
& follow
  follow <object>

  If you pass the object's follow lock, you begin following it. As the
  object moves around (except if it @teleports away or goes home), you
  will automatically move around with it, so long as you pass all the
  locks and enter/leave locks on the exits and things the object moves
  through. This doesn't prevent you from going somewhere else on your
  own.

See also: unfollow, dismiss, desert, followers(), following(), 
          @follow, @ofollow, @afollow
& dismiss
  dismiss <object>
  dismiss

  The dismiss command stops <object> from following you. If no object
  is given, it stops everyone from following you.

See also: follow, unfollow, desert, followers()
& desert
  desert <object>
  desert
 
  The desert command stops <object> from following you and stops you
  from following <object>. That is, it's shorthand for 'unfollow <object>'
  and 'dismiss <object>'. If no object is given, it stops everyone from
  following or leading you.

See also: follow, unfollow, dismiss, followers(), following()
& get
& take
  get <object>
  take <object>

  You pick up object, if you pass the object's @lock. You can also do 
  get <thing>'s <object>, which will fail if either thing is not ENTER_OK 
  or the object is locked against you. Some MUSHes choose to disable the 
  ability to take an object in someone else's inventory.
  
See also: @lock, ENTER_OK, give, drop, @success, inventory
& give
  give[/silent] <player>=<number>
  give <player>=<object>

  Gives player the specified <number> of pennies or <object>. You can't give 
  someone pennies if their new total would be greater than 10000 pennies. 
  (No reason to get greedy).  The /silent switch suppresses the default 
  message indicating how many pennies were given. Wizards may "give"
  a negative number of pennies.

  You may also give players objects, but the other player must be set
  ENTER_OK in order to receive something you give.

  Giving money to an object gives the money to the object's owner. Some
  MUSHes may have @lock/give enabled, which determines who is allowed
  to give an object.

See also: @pay, @cost, @lock, inventory, @receive, @give
& go
& goto
& move
  go[to] <direction> 
  go[to] home
  move <direction>
  move home

  Goes in the specified direction. <Direction> can be the name or alias of
  an exit in your area, the enter alias of an object in your area, or
  the leave alias of the object you are in. You do not need to use the
  word 'go' or 'move', in fact -- simply typing the direction will have the
  same effect.

  'go home' is a special command that returns you to your home room/object.
  Some MUSHes may disable this command.

See also: HOME, @link, @ealias, @lalias, EXITS
& index
  index

  A file similar to news, often indexing the news and events files.
  May not be available on some MUSHes.
& INFO
  INFO

  This command returns some information about the MUSH you are on, such
  as its version number, time of last restart, number of players currently
  connected, and size of database. It can be issued from the connect
  screen.
& inventory
  inventory

  Lists what you are carrying. Can be abbreviated by just 'i', or 'inv'.
  It also tells you how much MUSH money you have. If you are not set
  OPAQUE, others will also be able to see what is in your inventory by
  looking at you.

  Note that on some MUSHes it is possible to take things that are in 
  someone else's inventory. To be safe, @lock any objects that you do
  not want to lose.
  
See also: score, take, drop, OPAQUE, @lock
& kill
  kill <player> [=<cost>]

  Attempts to kill the specified player. Killing costs <cost> pennies, which 
  gives you a <cost>% chance of killing the player. Thus, spending 100
  pennies always works (except against wizards,  who can never be killed).
  If you don't specify a cost, the default is 10 (i.e. 10%).  The player,
  if killed, receives <cost>/2 pennies in insurance.

  You can not kill a player in a room that they control unless you
  also control the room.
  Only wizards can kill players in rooms which have been set HAVEN. 
  This command may be disabled in this MUSH.

See also: BEING KILLED, HAVEN, FLAGS, powers list
& leave
  leave

  The command leave allows you to exit an object you have enter'ed 
  into. When you leave an object, its @leave/@oleave/@oxleave messages
  are triggered, and its @aleave actions are triggered. 

  The NO_LEAVE flag may be enabled on some MUSHes. Objects set with this
  flag cannot be left. @lock/leave may also be enabled on some MUSHes,
  which allows you to set who can leave the object. If you fail to
  leave, the object's @lfail/@olfail/@alfail messages/actions will be
  triggered.

See also: enter, @leave, @lfail, @lock, INTERIORS 
& LOGOUT
  LOGOUT

  LOGOUT is similar to QUIT, but instead of disconnecting you from the
  game completely, it merely disconnects you from your current
  character and returns you to the opening welcome screen. This is
  useful if you want to disconnect and then reconnect to another
  character. Unlike most commands, it is case-sensitive and must be
  typed in all caps.
& look
& read
  look [<object>]
  look <person>'s <object>
  look/outside

  Displays the description of <object>, or the room you're in if you don't 
  name a specific object.  You can specify object as <name> or #<dbref> or 
  'me' or 'here'. On some MUSHes, 'read' may work the same as 'look'. The 
  second form of this command allows you to look at objects held by other 
  people, if the person is not OPAQUE.
    
  Look can take one switch, "outside". look/outside allows you to
  look at objects outside your current location, as long as your
  immediate location is not a room, and is not OPAQUE.

(continued in help look2)
& look2
  If you look at an object that is not set OPAQUE, you will see any non-DARK
  items in its inventory. You can look at DARK items in your location if 
  you know what their name is by typing 'look <object>', but they will
  not show up in the list of contents.

  When you type 'look' alone, you look at your current location. For a room,
  this normally shows you the room's description, the list of contents, and
  any obvious exits from the room. For an object, it only shows you the
  interior description (@idescribe).
  
  If a room is set DARK, when you look you will not see any of the exits
  or contents of the room, unless they are set LIGHT. 

  'look' may be abbreviated 'l'.
  
See also: OPAQUE, FLAGS, @describe, @adescribe, @odescribe, DARK, LIGHT
& news
  news [<topic>]

  The news system works just like the help system. Many MUSHes use it to
  provide standard information on the rules, theme, and customized
  commands of the particular MUSH. It is highly recommended that you 
  read it regularly.
& page 
  page[/<switch>] [<player-list>=]<message>.

  This command sends a message to a player or list of players. If
  the player's name contains spaces, surround it with double-quotes.
  If you have already paged someone since connecting, just typing:

    page <message>

  will send the message to the last person paged. You cannot page a 
  player if they are set HAVEN or if you do not pass their @lock/page.

  Examples:
    > page airwolf=hi there!
    You paged Airwolf with 'hi there!'.
    > page see, I don't have to retype the name.
    You paged Airwolf with 'see, I don't have to retype the name.'.
    > page "John Lennon" Ringo=Paul's fine!

(continued in help page2)
& page2
  Page will attempt a partial match on the name, checking both for an
  @alias and to see if the name matches someone connected. If the first
  character of <message> is a : or a ;, it will send the page in pose
  format.  

  Objects may page players, but not vice versa. If an object pages
  a NOSPOOF player, that player will see the object's number in
  square brackets, in front of the message, in a fashion similar to
  the way NOSPOOF flags emits.

  Page takes four switches: /list, /blind, /noeval and /port. 
  The /list and /blind switches provide two different ways of handling
  pages to lists of players. With /list, each paged player sees the
  list of who was paged, and the paging player is notified only once.
  With /blind, it's as if each player was individually paged. 
  The default list behavior is set by the blind_page @config option.
  The /noeval switch prevents the MUSH from evaluating the message.
  The /port switch is admin-only, and will page a port descriptor directly, 
  including connections that have not yet logged into a player.
  
See also: @lock, @alias, pose, :, ;, HAVEN, NOSPOOF, FLAGS
& :
& ;
& pose
& semipose
  pose[/noeval] <action pose>
  :<action pose>

  pose[/nospace] <action pose>
  semipose[/noeval] <action pose>
  ;<action pose>
 
  Displays your name followed by the statement you posed.  May be abbreviated
  by the ':' symbol. Normally, a space is placed between your name and the
  action you are posing. If you do not wish to have a space inserted, use
  the /nospace switch, the 'semipose' command, or the ';' symbol and don't
  add a space between the ; and the <action pose>.
  The /noeval switch prevents the pose from being evaluated by
  the parser.

(continued in help pose2)
& pose2
 
  Examples:
    If you are player Bob, and you type in ':laughs out loud.' or
    'pose laughs out loud.' everybody in the room will see:
    "Bob laughs out loud." 
  
    If you are player Bob, and you type in ';'s smiling today.' or
    'pose/nospace 's smiling today.' everybody in the room will see:
    "Bob's smiling today."
& "
& say
  say <message>
  say/noeval <message>
  "<message>

  Says <message> out loud. The message will be enclosed in double-quotes.
  A single double-quote is the abbreviation for this common command.

  Say takes one switch, /noeval. The /noeval switch prevents any evaluation 
  of the message, and is handy when you want to say things that use special 
  characters like % or []'s.

  See also: whisper, pose
& score
  score
  
  Displays how many pennies you are carrying.  Helpful to see if
  any machines are looping. If they are, your pennies will be being 
  rapidly drained. MUSH money may also be used for other purposes in
  the game.
  
See also: LOOPING, @ps, QUEUE, MONEY
& slay
  slay <player/object> 

  This is a Wizard-only command that kills players without paying any 
  insurance to the victims. It is used in places where 'suicide' should 
  not pay.
  
  (Su-ic-ide is pain-less... {MASH theme})
& think
  think <message>

  You can use this command to send a private message to yourself. Pronoun
  substitution is performed. This is essentially equivalent to doing a
  "@pemit me=<message>", but with "think", there's no prepended text.
  One possible use: @adesc me=think %N just looked at you.
& QUIT    
  QUIT

  Log out and leave the game. Must be in all capitals.  
& unfollow
  unfollow
  unfollow <object>

  This command stops you from following an object that you were formerly
  following. If no object is given, you stop following everyone you
  were following.

See also: follow, dismiss, desert, followers(), @follow, @ofollow, @afollow
& use
  use <object>

  Attempts to use an object, triggering its @use/@ouse/@ause attributes.
  The person using the object must pass its uselock; no inheritance check
  is necessary. This is may be done remotely, by using a dbref number;
  it provides an easy way for non-TRUST objects to perform commands on
  TRUST objects.

  If the person fails to pass the object's uselock, the object's
  @ufail/@oufail/@aufail attributes are triggered.

See also: @use, @ouse, @ause, @charges, @runout
& whisper 
  whisper <player>=<message>
  whisper/silent <player>=<message>
  whisper/noisy <player>=<message>
  whisper/noeval <player>=<message>
  whisper/list <players>=<message>

  Whispers the message to the named person, if they are in the same
  room as you. No one will see the message you whisper.  You can also
  whisper to things you are carrying, or to things that are carrying
  you. whisper <player>=:<pose> also works, in a fashion similar to
  page-pose.

  In a noisy whisper, other players in the room may be told who you whispered
  to (but not what you whispered): Polgara whispers to Javelin.
  The probability that a noisy whisper will be heard aloud is configurable.
  In a silent whisper, other players will not know that you whispered.
  The default whisper may be configured either silent or noisy (check @config)

(continued in help whisper2)
& whisper2
  The /noeval switch prevents any evaluation of the message, and
  is handy when you want to say things that use special characters
  like % or []'s.

  The /list switch lets you whisper to many people at once. Multiple
  persons should be space-separated, and names with spaces should be
  enclosed in double-quotes.
& WHO
  WHO   

  Displays a list of players currently connected to the MUSH.
  The WHO tells you how long a player has been on and how long they
  have been inactive. Unlike most commands, it is case sensitive.

See also: @doing, @poll, DOING
& with
  with <obj>=<command>

  Attempts to run a user-defined command on a specific object.

  See 'help USER-DEFINED COMMANDS'.
& Code
The latest version of this MUSH code is available via anonymous
FTP, at ftp.pennmush.org, directory /pub/PennMUSH/Source.  It will
be called something like pennmush-1.7.6p0.tar.Z, or similar,
depending on the version number. You will also find files
of translations of server messages into various languages in
/pub/PennMUSH/Source/translations/<version>. See help i18n for more.

Also on that site is the MUSH manual, in /pub/PennMUSH/Manuals. It
should be called mushman.2.008.tar.Z or something similar; you should
attempt to get at least version 2.007.
Also on that site is Javelin's Guide for PennMUSH Gods, in
/pub/PennMUSH/Guide. A better way to read it is on the Web at
http://www.pennmush.org/~alansz/guide.html

This code version is being maintained by Javelin, aka Alan Schwartz. 
Suggestions, comments, and bug reports are welcome; send email to
dunemush@pennmush.org.  For information about changes in versions of the 
code, see 'help changes'.
& i18n
& internationalization
& locale
& translation
Internationalization support in PennMUSH includes:
* Support for (8-bit) locale-based character sets, including
  translation of iso-8859-1 accented characters to html entities for
  Pueblo, the accent() and stripaccents() functions, and the NOACCENTS
  flag.
* Support for locale-based date/time formats
* Support for locale-based message sets for translations of server
  messages. There are active translation teams (and you can join!)
  and several languages have practically complete translation files
  available from the PennMUSH ftp site.
* Some support for locale-based string collation
* The ability to alias command and function names, so you can generate
  a set of translated commands/functions.

Most of these features get enabled by setting an appropriate environment
variable in the PennMUSH restart script.

& copyright
& copyrite
& license
Copyright, License, and Credits for PennMUSH 1.x. Revised October 2002.

I. Copyrights

PennMUSH 1.x
Copyright (c) 1995-2002, Alan Schwartz, T. Alexander Popiel, Shawn Wagner
Contact email for Alan Schwartz: <dunemush@pennmush.org>. 

Some code used in this server may have been derived from the
TinyMUSH 2.2 source code, with permission. TinyMUSH 2.2 is
Copyright (c) 1994-2002, Jean Marie Diaz, Lydia Leong, and Devin Hooker.

Some code used in this server may have been directive from TinyMUSH 2.0.
Copyright (c) 1995, Joseph Traub, Glenn Crocker.

Some code used in this server may have been directive from TinyMUD.
Copyright (c) 1995, David Applegate, James Aspnes, Timothy Freeman
and Bennet Yee.

 *------------------------------------------------------------------------*

II. License

Because PennMUSH includes parts of multiple works, you must comply
with all of the relevant licenses of those works. The portions derived
from TinyMUD/TinyMUSH 2.0 are licensed under the following terms:

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that: (1) source code distributions
  retain the above copyright notice and this paragraph in its entirety, and
  (2) distributions including binary code include the above copyright 
  notice and this paragraph in its entirety in the documentation or other 
  materials provided with the distribution.  The names of the copyright 
  holders may not be used to endorse or promote products derived from 
  this software without specific prior written permission.

  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

The portions derived from TinyMUSH 2.2 are used under the Artistic
License. The Artistic License is also the license under which you
are granted permission to copy and modify PennMUSH:

The Artistic License

Preamble

The intent of this document is to state the conditions under which a
Package may be copied, such that the Copyright Holder maintains some
semblance of artistic control over the development of the package,
while giving the users of the package the right to use and distribute
the Package in a more-or-less customary fashion, plus the right to make
reasonable modifications.

Definitions:

"Package" refers to the collection of files distributed by the Copyright
Holder, and derivatives of that collection of files created through
textual modification.
"Standard Version" refers to such a Package if it has not been modified,
or has been modified in accordance with the wishes of the Copyright
Holder.
"Copyright Holder" is whoever is named in the copyright or copyrights
for the package.
"You" is you, if you're thinking about copying or distributing this Package.
"Reasonable copying fee" is whatever you can justify on the basis of media
cost, duplication charges, time of people involved, and so on. (You will
not be required to justify it to the Copyright Holder, but only to the
computing community at large as a market that must bear the fee.)
"Freely Available" means that no fee is charged for the item itself,
though there may be fees involved in handling the item. It also means
that recipients of the item may redistribute it under the same conditions
they received it.

1. You may make and give away verbatim copies of the source form of the
Standard Version of this Package without restriction, provided that
you duplicate all of the original copyright notices and associated
disclaimers.

2. You may apply bug fixes, portability fixes and other modifications
derived from the Public Domain or from the Copyright Holder. A Package
modified in such a way shall still be considered the Standard Version.

3. You may otherwise modify your copy of this Package in any way, provided
that you insert a prominent notice in each changed file stating how and
when you changed that file, and provided that you do at least ONE of
the following:

 a) place your modifications in the Public Domain or otherwise make them
 Freely Available, such as by posting said modifications to Usenet or an
 equivalent medium, or placing the modifications on a major archive site
 such as ftp.uu.net, or by allowing the Copyright Holder to include your
 modifications in the Standard Version of the Package.

 b) use the modified Package only within your corporation or organization.

 c) rename any non-standard executables so the names do not conflict with
 standard executables, which must also be provided, and provide a separate
 manual page for each non-standard executable that clearly documents how
 it differs from the Standard Version.

 d) make other distribution arrangements with the Copyright Holder.

4. You may distribute the programs of this Package in object code or
executable form, provided that you do at least ONE of the following:

 a) distribute a Standard Version of the executables and library files,
 together with instructions (in the manual page or equivalent) on where
 to get the Standard Version.

 b) accompany the distribution with the machine-readable source of the
 Package with your modifications.

 c) accompany any non-standard executables with their corresponding
 Standard Version executables, giving the non-standard executables
 non-standard names, and clearly documenting the differences in manual
 pages (or equivalent), together with instructions on where to get the
 Standard Version.

 d) make other distribution arrangements with the Copyright Holder.

5. You may charge a reasonable copying fee for any distribution of
this Package. You may charge any fee you choose for support of this
Package. You may not charge a fee for this Package itself. However, you
may distribute this Package in aggregate with other (possibly commercial)
programs as part of a larger (possibly commercial) software distribution
provided that you do not advertise this Package as a product of your own.

6. The scripts and library files supplied as input to or produced as
output from the programs of this Package do not automatically fall under
the copyright of this Package, but belong to whomever generated them,
and may be sold commercially, and may be aggregated with this Package.

7. C or perl subroutines supplied by you and linked into this Package
shall not be considered part of this Package.

8. The name of the Copyright Holder may not be used to endorse or
promote products derived from this software without specific prior
written permission.

9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.

The End
& @config parameters
 Many of the mush's run-time options can be set from the game by
 wizards, using @config/set <option>=<new value>. Those that can be set
 with visible changes are listed below, grouped by category. See help
 @config <category> for details on each.

  Attribs      Chat       Cmds        Cosmetic      Costs
  Db           Dump       Funcs       Limits        Log
  Net          Tiny

 The categories and groups are the same as those used by @config/list.
 Values must be of the listed type for each option. They include:
 <number>, <dbref>, <boolean> (Yes/No), or <string>.
& @config attribs
 These options control wether or not some built in attributes are checked.

  adestroy=<boolean>: Is the @adestroy attribute used?
  amail=<boolean>: Is the @amail attribute used?
  player_listen=<boolean>: Is @listen checked on players?
  player_ahear=<boolean>: Is @ahear triggered on players?
  room_connects=<boolean>: Are @aconnect and @adisconnect triggered on rooms?
  global_connects=<boolean>: Are @aconnect and @adisconnect triggered on
   objects in the master room?
& @config chat
 These options control chat system settings.

  chan_cost=<number>: How many pennies a channel costs to create.
  max_channels=<number>: How many channels can exist total.
  max_player_channels=>number>: How many channels can each non-admin
   player create? If 0, mortals cannot create channels.
& @config cmds
 These options affect command behavior.

  globals=<boolean>: Is the master room checked for commands and exits?
  noisy_whisper=<boolean>: Does whisper default to whisper/noisy?
  possessive_get=<boolean>: Does "get container's object" work?
  possessive_get_d=<boolean>: Does it work on disconnected players?
  link_to_object=<boolean>: Can exits have objects as their destination?
  owner_queues=<boolean>: Are command queues kept per-owner, or per-object?
  restricted_building=<boolean>: Does it take the builder @power to build?
  free_objects=<boolean>: If restricted_building is on, can @create be used
   without the builder @power?
  full_invis=<boolean>: Should say by a dark player show up as
   'Someone says,'?
  wiz_noaenter=<boolean>: If yes, dark players don't trigger @aenters.
  player_locate=<boolean>: Can mortals find the locations of remote players?
  cemit_power=<boolean>: Should the cemit @power control @cemit?
  really_safe=<boolean>: Does SAFE prevent @nuking?
  hate_dest=<boolean>: Does @destroy work?
  destroy_possessions=<boolean>: When a player is destroyed, are their objects
   as well?
& @config cosmetic
 These are cosmetic options of various sorts.

  money_singular=<string>: What is one penny called?
  money_plural=<string>: What are many pennies called?
  player_name_spaces=<boolean>: Can player names have spaces in them?
  ansi_names=<boolean>: Are names in look hilighted?
  ansi_justify=<boolean>: Do ljust() and rjust() take ansi codes into
   account?
  float_precision=<numbers>: How many digits after the decimal point in
   floating point numbers are kept when formatting the result of a
   floating point function?
  comma_exit_list=<boolean>: Do exits show up like North, East, and West
   or as North East West?
  count_all=<boolean>: Does the count of connected players in WHO include
   hidden connections for mortals?
  blind_page=<boolean>: Does page default to page/blind?

Continued in help @config cosmetic2
& @config cosmetic2
 More cosmetic options.

  page_aliases=<boolean>: Are aliases included in page listings?
   For example, Foo(F) pages: Blah
  flags_on_examine=<boolean>: Are flag names included when examining
   objects?
  ex_public_attribs=<boolean>: Show visual attributes when examining objects
   you don't control?
  wizwall_prefix=<string>: Prefix for @wizwall messages.
  rwall_prefix=<string>: Prefix for @rwall messages.
  wall_prefix=<string>: Prefix for @wall messages.
  chat_strip_quote=<boolean>:  Does +chan "foo strip the "?
  newline_one_char=<boolean>: Is strlen(%r) equal to 1?
  only_ascii_in_names=<boolean>: Names are ascii-only or are extended
   characters permitted?
& @config costs
 These options control how many pennies various things cost.

  object_cost=<number>: How many pennies it costs to create an object.
  exit_cost=<number>: How many pennies it costs to create an exit.
  link_cost=<number>: How many pennies it costs to use @link.
  room_cost=<number>: How many pennies it costs to @dig a room.
  queue_cost=<number>: How many pennies it costs to queue a command.
   Refunded when the command executes.
  quota_cost=<number>: How much @quota goes down by for each object.
  find_cost=<number>: How many pennies it costs to use @search, @find,
   @entrances, and their function versions.
  page_cost=<number>: How many pennies it costs to use page.  
  kill_default_cost=<number>: Default cost for kill.
  kill_min_cost=<number>: Smallest amount of pennies for kill.
  kill_bonus=<number>: What percent of the pennies spent for a successful
   kill go to the victim.
& @config db
 These are database options.

 player_start=<dbref>: What room newly created players are in.
 master_room=<dbref>: The location of the master room.
 base_room=<dbref>: The starting room used to determine if other rooms
  are disconnected.
 exits_connect_rooms=<boolean>: Is a room with any exit at all in not
  considered disconnected for FLOATING checks?
& @config dump
 These options affect database saves and other periodic checks.

  forking_dump=<boolean>: Does the game clone itself and save in the
   copy, or just pause while the save happens?
  dump_message=<string>: Notification message for a database save.
  dump_complete=<string>: Notification message for the end of a save.
  dump_warning_1min=<string>: Notification one minute before a save.
  dump_warning_5min=<string>: Notification five minutes before a save.
  dump_interval=<number>: Seconds between database saves.
  warn_interval=<number>: Seconds between automatic @wchecks.
  purge_interval=<number>: Seconds between automatic @purges.
  dbck_interval=<number>: Seconds between automatic @dbcks.
& @config funcs
 These options affect the behavior of some functions.

 haspower_restricted=<boolean>: Is haspower() available only to objects
  with see_all?
 safer_ufun=<boolean>: Are objects stopped from evaluting attributes on
  objects with more privledges than themselves?
& @config limits
 Limits and other constants.

  max_dbref=<dbref>: The highest dbref an object can have. If 0,
   there is no limit on database size.
  max_attrs_per_obj=<number>: The maximum attributes an object can have.
  max_logins=<number>: The maximum number of connected players.
  idle_timeout=<number>: The number of minutes a connection can be idle
   before getting booted. 0 means no limit.
  whisper_loudness=<number>: The percentage change of a whisper/noisy
   being heard.
  starting_quota=<number>: How much quota new players get.
  starting_money=<number>: How many pennies new players get.
  paycheck=<number>: How many pennies players get each day they log on.
  max_pennies=<number>: The maximum pennies an object can have.
  mail_limit=<number>: How many @mail messages someone can have.
  max_depth=<number>: How deep can @parent chains can go.

Continued in help @config limits2
& @config limits2
 Limits and constants, continued.

  player_queue_limit=<number>: The number of commands a player can have
   queued at once.
  queue_loss=<number>: One in <number> times, queuing a command will cost
   an extra penny that doesn't get refunded.
  queue_chunk=<number>: How many queued commands get executed in a row when
   there's no network activity pending.
  active_queue_chunk=<number>: How many queued commands get executed in a
   row when there is network activity pending.
  function_recursion_limit=<number>: The depth to which softcode functions
   can call more functions.
  function_invocation_limit=<number>: The maximum number of softcode
   functions that can be called in one command.
  guest_paycheck=<number>: How many pennies guests get each day.
  max_guest_pennies=<number>: The maximum pennies a guest can have.
  player_name_len=<number>: The maximum length of a player name.
  queue_entry_cpu_time=<number>: The maximum number of milliseconds a
  queue entry can take to run.
& @config log
 These options affect logging.

  log_commands=<boolean>: Are all commands logged?
  log_huhs=<boolean>: Are commands that produce Huh? messages logged?
  log_forces=<boolean>: Are @forces of wizard objects logged?
  log_walls=<boolean>: Are @walls logged?
& @config net
 Networking and connection-related options.
 
  mud_name=<string>: The name of the mush for mudname() and @version and
   the like.
  use_dns=<boolean>: Are IP addresses resolved into hostnames?
  use_ident=<boolean>: Is ident information looked up for connections?
  ident_timeout=<number>: How long does the mush wait before an ident
    request fails?
  logins=<boolean>: Are mortal logins enabled?
  player_creation=<boolean>: Can CREATE be used from the login screen?
  guests=<boolean>: Are guest logins allowed?
  pueblo=<boolean>: Is Pueblo support turned on?
& @config tiny
 Options that help control compability with TinyMUSH servers.

  null_eq_zero=<boolean>: Is a null string where a number is expected
   considered a 0?
  tiny_booleans=<boolean>: Use Tiny-style boolean values where only
   non-zero numbers are true.
  tiny_trim_func=<boolean>: Are the second and third arguments to trim()
   reversed?
  tiny_math=<boolean>: Is a string where a number is expected considered
   a 0?
  tiny_attrs=<boolean>: Are attribute names, flags and owners displayed
   Tiny-style?
  silent_pemit=<boolean>: Does @pemit default to @pemit/silent?
& FLAGS
  @set <object>=[!]<flag name>

  Flags give objects certain abilities or qualities. For example,
  a wizard player has wiz powers because s/he has the WIZARD flag
  set.

  Some flags can only be set on certain types of objects, such as
  just players or just rooms. Other flags, like VISUAL, can be set
  on any type of object (player, room, exit, thing).

  To un-set a flag, use the exclamation point (!) before the flag
  name. For help on any particular flag, type: help <flag name>

  The list of flags is available in: help flag list

(continued in help flags2)
& FLAGS2
  You can see the list of flags set on an object in several ways.

  1.  If you are allowed to examine the object. The flags are listed in
  expanded word format on the line just below the object's name, after
  the word "Flags:".
  2.  Flag abbreviations are also visible after the object's name in the
  room description (if the object is not set OPAQUE and you are not set
  MYOPIC).
  3.  The flags() function will also return the object's list of flag
  abbreviations.

  Note: ROOM, PLAYER, EXIT, and GARBAGE are special flags which
  indicate the TYPE of an object. The absence of these four special flags
  indicates the object is of type THING.

  See also: examine, flags(), hasflag(), orflags(), andflags()
          types of objects, type(), hastype()
& FLAG LIST
& FLAGS LIST
Flag  Title           Flag  Title              Flag  Title
-----------------------------------------------------------------------
  A - Abode, Ansi       C - Chown_Ok, Color     D - Dark
  E - Exit (type)       F - Floating, Fixed     G - Going
  H - Haven             I - Trust/Inherit       J - Jump_Ok, Judge
  L - Link_Ok           M - Monitor             N - Nospoof, No_Tel, No_Leave
  O - Opaque            P - Player (type)       Q - Quiet
  R - Room (type)       S - Sticky              U - Unfindable
  V - Visual            W - Wizard              X - Safe
  Z - Shared, Z_Tel
  
  a - Audible           b - Debug               c - Connected, Cloudy
  d - Destroy_Ok        e - Enter_Ok            g - Gagged
  h - Halt              j - Jury_Ok             l - Light             
  m - Myopic            n - No_Command          o - On-Vacation
  p - Puppet, Paranoid  r - Royalty             s - Suspect
  t - Transparent       u - Uninspected         v - Verbose
  w - No_Warn           x - Terse               ? - Unregistered
  ^ - Listen_Parent     ~ - Noaccents
---------------------------------------------------------------------
Some flags may not be enabled on some MUSHes.

& ABODE
 Flag:  ABODE  (rooms)

  If a ROOM has the ABODE flag set, any PLAYER can set his home there,
  and can set the homes of THINGs there.  It does not mean that a
  player can open an exit to that room, only that they can set their
  home there.  This flag should not be set unless you want to make the
  room a public 'living area'.

  To make a room your home, type '@link me=here' while standing in the
  room.

  See also: @link
& ANSI
  Flag:  ANSI  (players)
  
  When set on a player, this flag bold-hilites the names and owners
  of attributes when the player "examines" an object. This makes it
  much easier to pick out where attributes begin and end, when examining
  complex objects. You must be using a terminal which supports ANSI
  control codes in order for this to work. Additionally, some MUSHes
  may not support ANSI. Check @config to see.
  
  See also the COLOR flag. If COLOR is not set, and ANSI is, you will
  see vt100 ANSI codes, but not color ANSI codes.

  See also: COLOR, ansi(), @config
& AUDIBLE
  Flag:  AUDIBLE  (all types)

  Exits that are AUDIBLE propagate sound to their destinations. In
  other words, any message - emit, say, or pose - that is heard in the
  source room of the exit is passed on to the contents of the exit's
  destination room. The message is prepended with the exit's @prefix
  attribute; if there is no @prefix, the default is used:
  
  "From <name of the exit's source room>,"
  
  Messages matching a certain pattern may be filtered out by using
  @filter on an exit; read 'help @filter' for more. If the object 
  has a @forwardlist, sounds that pass the @filter are sent on to
  the objects in the @forwardlist.
  
  In order for exits in a room to propagate sound, the room must also
  be set AUDIBLE. If the room is audible, exits that are audible show 
  up on a @sweep, even if they are set DARK.
   
  See "help AUDIBLE2" for more.
 
& AUDIBLE2
  This flag is also valid for things. If an object is set AUDIBLE,
  any messages which originate from its contents will be broadcasted
  to the outside world. This makes it very simple to program vehicles.
  Like AUDIBLE on exits, the message is prepended with the thing's
  @prefix attribute, and messages matching certain patterns may be
  filtered with @filter. If there is no @prefix, the message will be
  prepended with "From <name of AUDIBLE object>,"
  The AUDIBLE object does not receive its own propagated messages.
 
  The AUDIBLE flag allows most "emitters" (objects that listen for
  messages and broadcast them to other rooms) to be eliminated. The
  message is propagated only to the next room and no farther, so 
  there is no danger of looping.
& BUILDER
  BUILDER 

  BUILDER is actually an @power rather than a flag. Some MUSHes choose
  to limit the building commands (@dig, @open, and sometimes even 
  @create) to registered builders only. If you are on a MUSH that does
  this, you will not be able to use these commands unless you have the
  power. Only wizards can grant @powers. To see if building is limited, 
  check @config.

  See also: POWERS, @power, @dig, @open, @create, @config
& CHOWN_OK
  Flag:  CHOWN_OK  (things, rooms, exits)

  You can set this flag on an object you own to allow other players 
  to transfer ownership of the object to themselves (using @chown).
  You must be carrying the thing, or in the room in order to set the
  flag, unless you use the DBREF number.

  See also: @chown
& CLOUDY
  Flag:  CLOUDY (exits)

  If this flag is set on a (non-TRANSPARENT) exit, when a player looks
  at the exit they will see the contents of the destination room
  following the exit's description.

  If the flag is set on a TRANSPARENT exit, when a player looks at the 
  exit they will see only the description of the destination room
  following the exit's description, and will not see contents.
& COLOR
  Flag:  COLOR  (players)
  
  When set on a player, this flag allows the player to see ANSI color.
  The ANSI flag must also be set.

  See also: ANSI, ansi()
& CONNECTED
  Flag:  CONNECTED  (players)

  This internal flag applies only to players and it shows if the 
  player is connected or not. Only admin can see this flag. No one
  can set or reset this flag. 

  Mortal code can't use hasflag(<x>,connected) to test if a player is 
  connected. Consider using conn(), lwho(), or mwho() instead.

  See also: conn(), lwho(), mwho()
& DARK
  Flag:  DARK  (all types)

  If a room is DARK, then no items are shown when a person 
  'looks' there. If a thing is DARK, then "look" does not list that 
  object in the room's Contents:, and if an exit is DARK, it doesn't
  show up in the Obvious Exits: list.  Puppets and audible objects
  with @forwardlist are not concealed by this flag.  Note that players,
  puppets, and other "hearing" objects still trigger enter/leave messages
  when in DARK areas.  There is a config option for "full invisibility":
  players and objects that are dark will be slightly disguised in
  speech and poses.  Such actions by these objects will show as being
  from Someone or Something depending on whether it was an object or
  wizard player.

  See 'help DARK2' for more.

& DARK2
  Players who can hide from the WHO list should use @hide/on and
  @hide/off to control this, not the DARK flag. While any player can
  turn off their DARK flag, only Wizards can set their DARK flag.

  Wizards who are DARK "disappear" completely -- they are not on the WHO
  list, do not announce connects and disconnects, etc.
& DEBUG
  Flag: DEBUG  (all types)
  
  The DEBUG flag is used for debugging MUSHcode. It is meant to be used
  in conjunction with the VERBOSE flag. If an object is set DEBUG, all
  parser evaluation results will be shown to the object's owner, in the
  format:
 
  #dbref! <string to evaluate> :
  #dbref!  recursive evaluation of functions in string
  #dbref! <string to evaluate> => <evaluated string>

  Note that verbose output is "#obj]" - debug output is "#obj!".
  
  Because the parser does recursive evaluations, you will see successive
  messages evaluating specific parts of an expression. This enables you
  to pinpoint exactly which evaluation is going wrong.
  
  Objects run under this flag are computationally expensive.
  Avoid leaving it set on objects. It can also generate huge amounts of
  spam from the output.
  
  See "help DEBUG2" for more.
& DEBUG2
  
  Create test, and set it DEBUG.
  
  > @va test=$wc *:"String %0 has [strlen(%0)] letters and [words(%0)] words.
  > wc This is my test string
  #14! String %0 has [strlen(%0)] letters and [words(%0)] words. :
  #14!  strlen(%0) :
  #14!   %0 => This is my test string
  #14!  strlen(%0) => 22
  #14!  words(%0) :
  #14!   %0 => This is my test string
  #14!  words(%0) => 5
  #14! String %0 has [strlen(%0)] letters and [words(%0)] words. =>
    String This is my test string has 22 letters and 5 words.
  Test says, "String This is my test string has 22 letters and 5 words."
& DESTROY_OK
  Flag:  DESTROY_OK  (things)

  The DESTROY_OK flag allows anyone to @destroy it. This is good for
  "temporary" objects like "Can of Cola". If the object has a
  @lock/destroy set, a player who doesn't control the object
  must pass this lock in order to destroy it.

  DESTROY_OK takes precedence over SAFE.

  See also: @destroy
& ENTER_OK
  Flag:  ENTER_OK  (all types)
 
  If an object or person is ENTER_OK, other players may 
  enter the object or person by using 'enter <object/person>.
  Only objects which are ENTER_OK may be entered, regardless of the
  enter lock. Players must also have the ENTER_OK flag set if they wish
  to be able to receive  things given to them by other players via the 
  command 'give <player> = <object>'.  

  This flag has no effect on rooms.

  See also: enter, leave, give, @lock
& FIXED
  Flag: FIXED (players)
  
  When this flag is set on a player, it prevents them or any of their
  objects from using the @tel or home command. The only exception is
  that a player's objects are permitted to @tel themselves to the
  player's inventory.
& FLOATING
  Flag:  FLOATING (rooms)

  If a room is set floating, you will not be notified every 10 
  minutes or so that you have a disconnected room.
  A disconnected room may mean (depending on how the MUSH is
  configured) a room that can't be reached from room #0, or
  a room that can't be reached from room #0 and has no exits.
& GAGGED
  Flag: GAGGED (players)

  When set on a player, it disables him from doing anything 
  except moving and looking.  He cannot talk, page, build, pose, get 
  or drop objects. Normally used as a penalty for those who break
  MUSH rules.

  Only wizards can set this flag.
& GOING
  Flag:  GOING  (all types)

  Used internally for the @destroy command, it is set on things that
  are scheduled to be destroyed. To prevent a GOING object from being
  destroyed, use the @undestroy (or @unrecycle) command. You can no
  longer @set the object !GOING.

& HALT
  Flag:  HALT   (all types)

  While this flag is set, the object cannot perform any mush 
  actions, listen, be triggered, evaluate functions or substitutions,
  etc.

  See also: @halt, @restart
& HAVEN
  Flag:  HAVEN (players, rooms)

  If a player is set HAVEN, she cannot be paged and anyone paging them
  will be sent a brief notification. You can also set a longer @HAVEN
  message if you wish. You may prefer to use @lock/page to block out
  only specific individuals.

  If a room is set HAVEN, the 'kill' command cannot be used in that room.

  See also: @haven, kill
& INHERIT
& TRUST
  Flag:  TRUST  (all types)

  TRUST is a security flag used to prevent objects without authorization
  from using @force, @set, and @trigger on other objects.
  Authorization is successful if any of these are true:
 
     1. The enactor is WIZARD ("wizards control all").
     2. The enactor's owner is TRUST ("the player trusts all their objects").
     3. The enactor is TRUST ("this object is trusted").
     4. The target is not TRUST ("this object isn't trusted").

  That is, if a non-wizard player is set TRUST, all of their objects
  may act on each other (case 2). Otherwise, only TRUST objects may act
  on TRUST objects (case 3) but any of the player's object may act on
  non-TRUST objects (case 4).

  Only TRUST or WIZARD objects may force their owners. 
  Players can always @force, @set, and @trigger their objects. 

  This flag used to be called INHERIT, and INHERIT is still an alias
  for it, but TRUST better describes its action.
 
  Read "help trust2" for more.
& TRUST2
& INHERIT2
 
  Authorization is only denied if the enactor is neither a player nor
  TRUST, and the target is WIZARD, TRUST, or is a player.

  The TRUST protection against @trigger may be overridden by setting
  the target object LINK_OK.

  Objects which are WIZARD are not subject to any special criterion,
  although they are automatically considered to be TRUST.
  The normal criteria for object control still apply.
 
  The TRUST flag protects against an object from being controlled by
  anything not owned by its owner. This prevents someone who controls a
  zone master from doing things like @forcing an TRUST object to @force its
  owner.
& JUDGE
& JURY_OK
  Flags: JUDGE and JURY_OK (players)
 
  These flags may be used by the MUSH to support some form of Judged
  RP system. Or they may not be compiled in. See @config for more
  information.
& JUMP_OK
& TEL_OK
  Flag: JUMP_OK (or TEL_OK) (rooms)

  When a room is set JUMP_OK, then that room can be teleported into
  by anyone. See @teleport.
& LIGHT
  Flag:  LIGHT (all types)

  Objects, players, and exits which have the LIGHT flag set on them
  (and are not also set DARK) appear in the contents of DARK rooms.

  See also: DARK
& LINK_OK
  Flag: LINK_OK  (rooms, things)

  If a room or object is LINK_OK, anyone can link exits to it (but 
  still not from it). Also, LINK_OK overrides the TRUST protection
  against @trigger (although not @force or @set). This also allows 
  others to @parent their objects to the thing set LINK_OK.

  See @link, TRUST, @parent, PARENTS
& MONITOR
  Flag:  MONITOR  (players)
  
  When set on a player, this flag notifies that player when anyone connects
  to or disconnects from the MUSH. It is valid only for players, and must be
  set by a wizard (although royalty may set themselves MONITOR).

  Flag:  MONITOR  (things, rooms)
 
  When set on a thing or room, this flag activates the ^ listen patterns on
  the object. Objects which have ^ listen patterns but are not set MONITOR
  do not check those patterns.
& MORTAL
  The MORTAL flag is no longer available in PennMUSH. Please see help
  changes for more information.
& MYOPIC
  Flag:  MYOPIC  (players)

  Myopic is a flag which suppresses the printing of an object's dbref
  number and abbreviated list of flags when it is looked at. It makes
  the world appear like you don't control any of it, even if you're a
  wizard or royalty. It's useful if you don't like to see object numbers.
  This flag is only valid for players; objects belonging to MYOPIC
  players are automatically considered to be MYOPIC.

  See also: DBREF
& NOACCENTS
  Flag: NOACCENTS  (players)

  This flag causes all accented characters to be converted to non-accented
  before being sent to a connection. See HELP STRIPACCENTS() for caveats.

  See also: i18n, accent(), stripaccents()
& NO_COMMAND
  Flag:  NO_COMMAND  (all types)
  
  The NO_COMMAND flag disables the checking of $-commands on an object.
  Most MUSHes will be configured to automatically set this flag on rooms
  and players. The server runs faster when fewer objects are checked for
  $-commands; thus, any object which does not have $-commands on it should
  be set NO_COMMAND. Many MUSHes choose to have all objects initially set
  NO_COMMAND at creation.

  See also: USER-DEFINED COMMANDS
& NO_LEAVE
& NOLEAVE
  Flag: NO_LEAVE (objects)
  
  When this flag is set on an object, players can not "leave" it. 
  Attempts to leave the object will trigger its @LFAIL, @OLFAIL,
  and @ALFAIL, if set.

  See also: leave
& NO_TEL
  Flag:  NO_TEL  (rooms)

  The NO_TEL flag prevents objects in a room from being @teleported;
  mortals in the room cannot use @teleport, nor can other objects 
  @teleport them out. This flag is checked on the "absolute room" of an
  object; thus, if you are in a container in a room which is NO_TEL,
  you cannot use @teleport from that container. There is no way to
  get out of a NO_TEL room except by exiting in some "normal" manner,
  or by going "home". Puzzle rooms, prisons, and similar locations would
  probably benefit from this flag.
& NO_WARN
& NOWARN
  Flag: NO_WARN  (all types)

  This flag is enabled with the MUSH building warning system.

  When this flag is set on an object, its owner will not receive
  any building warnings from that object. When it is set on a player,
  that player will not receive any building warnings at all.

  See also 'help warnings', 'help @warnings', and 'help @wcheck'

& NOSPOOF
  Flag: NOSPOOF  (players)

  If a player is set NOSPOOF, @emits of all sorts will be tagged with the
  name of the person/object making them. This prevents spoofing and lets
  you see where such messages originated. Objects belonging to NOSPOOF 
  players are automatically considered NOSPOOF. 
  
  Note that NOSPOOF output can be spammy and that the output format of
  NOSPOOF can mess up @listen and ^ patterns, giving unexpected results.

  Sample output:
    @set me=nospoof
    > Flag set.
    @pemit me=Testing
    > [Cyclonus->Cyclonus] Testing

  See PARANOID, SPOOFING, @emit, @pemit, @remit, and @oemit.
& PARANOID
  Flag: PARANOID (players)

  Used in conjunction with the NOSPOOF flag. If a player is set
  PARANOID and NOSPOOF, @emits of all sorts are tagged with the
  name and dbref of the person/object making them and the name of
  the object's owner, if the emit was not from a player.

  See NOSPOOF, SPOOFING, @emit, @pemit, @remit, and @oemit.
& ON-VACATION
  Flag: ON-VACATION (players)

  This flag may be used by the MUSH to allow players to indicate when 
  they have left for vacation, to prevent themselves from being purged
  for inactivity. Its usefulness depends on game policy.

  You will be notified (periodically and on connect) if you leave this flag 
  set, to remind you to unset it when you return from vacation.
& OPAQUE
  Flag:  OPAQUE  (all types)

  When set on yourself, it prevents other players from 
  seeing what you are carrying in your inventory. This applies to
  everyone and everything, even wizards and royalty, or to stuff
  that you own. It works the same way on objects.

  When set on an exit in a TRANSPARENT room, the exit is displayed
  as if the room weren't TRANSPARENT.

  Meaningless for rooms.

  See also: TRANSPARENT, look
& PLAYER
  Flag:  PLAYER  (player)

  The PLAYER flag identifies you as a player. This flag cannot
  be reset by any player, not even a Wizard.  It is used by hardcode to 
  identify your commands, check for validity of commands or locks, etc.
  You can just pretend it isn't there. 
& PUPPET
  Flag:  PUPPET  (things)
  
  Setting this flag on a thing turns it into a sort of extension of its
  owner, making it grow eyes and ears. It then relays everything sees
  and hears back to its owner, unless the owner is in the same room.
  (If you set a puppet VERBOSE as well, it will relay even when the
  owner is in the same room).

See: @force, PUPPETS
& QUIET
  Flag:  QUIET  (all types)

  This flag when set on yourself prevents you from hearing 
  the 'set', 'triggered', or 'Teleported.' messages from any objects
  you own.  When set on an object, only that object will not relay
  its messages.
& ROOM
  Flag:  ROOM  (rooms)

  This flag is automatically set on rooms when you @dig a new
  room. It cannot be changed.
& ROYALTY
  Flag:  ROYALTY  (all types)

  If this flag is set on any type of object, then that object will
  be able to @tel and examine as if it was a wizard. Royalty players
  do not need money, nor are they affected by quotas or restricted
  building. Royalty is not able to change things like a wizard could. 
  Only wizards may set it on players, although players who are ROYALTY
  may set their objects ROYALTY.
& SAFE
  Flag:  SAFE  (all types)

  The SAFE flag protects objects from destruction. If the REALLY_SAFE
  option was set when the MUSH was compiled (see @config), the only
  way to destroy an object set SAFE is to explicitly reset the SAFE
  flag and then @dest it. If the REALLY_SAFE option is not set,
  @destroy/override (or @nuke) will override the SAFE flag and destroy
  the object.
& STICKY
  Flag:  STICKY  (all types)

  If a thing or player is STICKY, it goes home when dropped (See HOMES).
  It also goes home when an object carrying it teleports or goes home.
  If a room is STICKY, its drop-to is delayed until the last person leaves 
  (See DROP-TOs). This flag is meaningless for exits.
& SUSPECT
  Flag:  SUSPECT  (players)

  This flag is only settable by wizards. Players with this flag have
  their connects, disconnects, name changes, and kills reported to
  all connected wizards. All their actions are also logged to the MUSH
  log files.
& TEMPLE
  The TEMPLE flag is no longer available in PennMUSH. Please see help
  changes for more information.
& TERSE
  Flag:  TERSE  (players)

  When an object is set TERSE, it does not see the descriptions or
  success/failure messages in rooms. This is a useful flag if you're
  on a slow connection or you're moving through a familiar area and
  don't want to see tons of text. This flag is only valid for players;
  objects belonging to TERSE players are automatically considered to
  be TERSE.
& TRANSPARENT
  Flag:  TRANSPARENT  (all types)

  If this flag is set on a room, it will display exits in "long" format.
  Instead of putting all the exits on one line under "Obvious exits:"
  it prints each exit on a line by itself, in the format:
  <Exit Name> leads to <Exit Destination>.
  Thus, you might have:
     Obvious exits:
     South leads to Joe's Room.
     East leads to City Park.
  instead of
     Obvious exits:
     South  East

  Exits set OPAQUE are still shown in the short format, so you can mix
  the two.

(continued in help transparent2)
& TRANSPARENT2

  If this flag is set on an exit, when a player looks at the exit they
  will see the description and contents of the destination room following
  the exit's description.  The exit list and succ/fail messages of the
  room will NOT be displayed. See also CLOUDY.

  See also: CLOUDY, OPAQUE, EXITS, @exitformat
& UNFINDABLE
  Flag:  UNFINDABLE  (all types)
  
  If a player is set UNFINDABLE, he cannot be found by the @whereis 
  command. You also cannot use loc(), locate(), and similar functions
  to find his location, unless you have the see_all power or equivalent.
  
  If a room is set UNFINDABLE, you cannot locate any of its contents
  via any means (@whereis, the loc() function, etc.) unless you are
  see_all or equivalent.
  
  If a player who can @hide and idle is set UNFINDABLE, and he is idle past 
  the allowable maximum idle time, he will be hidden automatically.
& UNINSPECTED 
  Flag: UNINSPECTED (rooms)

  This flag may be used by the MUSH to indicate rooms which have not been
  inspected by the Building Council, Administration, etc.
& UNREGISTERED
  Flag: UNREGISTERED (players)
  
  This flag may be used by the MUSH to support on-line registration.
  The only restriction on UNREGISTERED players is that they may not
  be granted @powers.
& VERBOSE
  Flag:  VERBOSE  (all types)

  An object set VERBOSE echoes the commands it executes to its owner
  before executing them. This differs from the PUPPET flag in that the
  owner sees the command itself, rather than the output from the command.
  This flag is extremely useful in debugging, especially if used in
  conjunction with the PUPPET flag. VERBOSE output follows the format
  "#<object>] <command>". Something like "#1300] @trigger me/test" is a
  good example of typical VERBOSE output.

  See also: PUPPET, DEBUG
& VISUAL 
  Flag:  VISUAL  (all types)

  When this flag is set on an object, it allows any other player to
  examine it and see all the object's attributes as if they owned it.
  It does not enable them to make changes to the object. Very useful
  for getting help with code.

  See also: examine, brief
& WIZARD
  Flag:  WIZARD    (all types)

  If a person is WIZARD, they are a wizard, unkillable, 
  subject to fewer restrictions, and able to use wizard commands.  
  In general, WIZARDs can do anything using #<number> or *<player>. 
  Only player #1 can set and unset the WIZARD flag of other players. 
  No WIZARD can turn their own WIZARD flag off.

  Other objects may also be set WIZARD, and they then have all the 
  powers of a Wizard except that they cannot @nuke players.
  Only Wizards may set the WIZARD flag on objects.

  See also: ROYALTY, @power
& Z_TEL
  Flag:  Z_TEL  (all types)

  The Z_TEL flag, when set on a zoned room or on the ZMO of a room, 
  prevents objects in the room from being @teleported out of the
  zone - that is, objects can only be @teleported to a room which
  is zoned to the same ZMO. Setting this flag on the ZMO affects all
  rooms zoned to it. Like NO_TEL, the "home" command will still work.
  This flag is intended for use in puzzle rooms and IC areas.

  See also: ZONES, ZONE MASTERS, @chzone, ZONE MASTER ROOMS
& SHARED
& ZONE
  Flag:  SHARED   (players) 

  The SHARED flag is used to designate a player as a Zone Master.
  Objects owned by a Zone Master are controlled by anyone who passes the 
  player's zone lock.  

  See also: ZONE MASTERS
& LISTEN_PARENT
  Flag:  LISTEN_PARENT (things, rooms)
  
  When set on a thing or room which also has the MONITOR flag set, this
  flag causes ^ listen patterns to be checked on the object's parents as
  well as on the object.

  See also: MONITOR, LISTENING

& FUNCTIONS
  Functions are specialized commands used to manipulate strings and
  other input. Function take the general form:  [FUNCTION(<input>)]
    
  The brackets are used to delimit and force evaluation of the function 
  (or nested functions). The brackets can also be used to group functions 
  for the purposes of string concatenation. In general, more than one pair 
  of brackets is not required, but liberal use of them makes code easier to 
  read. You can nest an arbitrary number of brackets.

  Examples:
      > say [first(rest(This is a nice day))]
      You say, "is"
      > @va me=This is a 
      Wizard - Set.
      > @vb me=nice day
      Wizard - Set.
      > say [first([rest([v(va)] [v(vb)])])]
      You say, "is"
  
  See "help FUNCTIONS2" for more.
 
& FUNCTIONS2
  
  A list of available built-in functions can be obtained via the command
  "@config/functions". In the help text, the list is under the topic
  "FUNCTION LIST".
  
  In addition to these built-in functions are MUSH-defined "global user
  functions."  These are defined by wizards or those with the "Function"
  power, via the "@function" command. To the user, they act just like
  the built-in game functions. For details on global user functions,
  see "help @function".
  
  See also: MUSHCODE
& FUNCTION LIST
 
  Several major variants of functions are available. The help topics
  are listed below, together with a quick summary of the function type
  and some examples of that type of function.
 
  Attribute functions: attribute-related manipulations (GET, UFUN)
  Bitwise functions: Manipulation of individual bits of numbers (SHL, BOR)
  Boolean functions:  produce 0 or 1 (false or true) answers  (OR, AND)
  Channel functions: Get information about channels (CTITLE, CWHO)
  Communication functions: Send messages to objects (PEMIT, OEMIT)
  Dbref functions: return dbref info related to objects (LOC, LEXITS)
  Floating point functions: floating point math (SIN, ROUND)
  Global functions: local MUSH-specific functions defined with @function
  Information functions:  find out something about objects (FLAGS, MONEY)
  List functions:  manipulate lists (REVWORDS, FIRST)
  Mail functions: manipulate @mail (MAIL, FOLDERSTATS)
  Math functions:  number manipulation, generic or integers only (ADD, DIV)
  Regular expression functions: Regular expressions (REGMATCH, REGEDIT)
  String functions:  string manipulation (ESCAPE, FLIP)
  Time functions: Formatting and display of time (TIME, CONVSECS)
  Utility functions: general utilities (ISINT, COMP)
  
  The command "@config/functions" lists all of the game's built-in functions.
  The command "@function" lists all of the game's global functions.
  
& Attribute functions
  All these functions access attributes on an object.
  
  aposs()       default()     edefault()    eval()        filter()
  filterbool()  fold()        foreach()     get()         grep()
  grepi()       lattr()       obj()         poss()        regrep()
  regrepi()     subj()        udefault()    ufun()        uldefault()
  ulocal()      v-function    xget()        zfun()

  See also: ATTRIBUTES, NON-STANDARD ATTRIBUTES
& Bitwise functions
  These functions treat integers as a sequence of binary bits (Either 0
  or 1) and manipulate them.

  For example, 2 is represented as '0010' and 4 as '0100'. If these two
  numbers are bitwise-or'ed together with BOR(), the result is 6, or
  (In binary) '0110'. These functions are useful for storing small
  lists of toggle (Yes/No) options efficiently.

  band()        bnand()       bnot()        bor()         bxor()
  shl()         shr()

& Boolean functions
  Boolean functions all return 0 or 1 as an answer.
  Your MUSH may be configured to use traditional PennMUSH booleans,
  in which case non-zero numbers, non-negative db#'s, and strings
  are all considered "true" when passed to these functions.
  Alternatively, your MUSH may be using TinyMUSH 2.2 booleans,
  in which case only non-zero numbers are "true".
  
  and()         cand()        cor()         eq()          gt()
  gte()         lt()          lte()         nand()        neq()
  nor()         not()         or()          t()           xor()
    
  See also: BOOLEAN VALUES, @config
& Channel functions
  Channel functions work with the channel system.

  cflags()      channels()    clock()      ctitle()       cwho()
& Communication functions
  Communication functions are side-effect functions that send a message
  to an object or objects.

  cemit()       emit()        lemit()       nspemit()     oemit()
  pemit()       remit()       zemit() 
& Dbref functions
  Dbref functions return a dbref or list of dbrefs related to some value
  on an object.
  
  con()         entrances()   followers()   following()   home()        
  lcon()        lexits()      loc()         locate()      lparent()     
  lsearch()     next()        num()         owner()       parent()      
  pmatch()      rloc()        rnum()        room()        where()       
  zone()
  
  See also: DBREF
& Information functions
  Information functions return values related to objects.
 
  andflags()    config()      
  conn()        controls()    ctime()       doing()       elock()
  findable()    flags()       fullname()    hasattr()     hasattrp()
  hasflag()     haspower()    hastype()     hidden()      idle()
  iname()       lock()        lstats()      lwho()        money()
  mtime()       mwho()        name()        nattr()       nearby()
  objmem()      orflags()     playermem()   poll()        ports()
  powers()      quota()       type()        visible()

& Mail functions
  Mail functions work with @mail.

  folderstats() mail()        maildstats()  mailfrom()    mailfstats()
  mailstats()   mailstatus()  mailsubject() mailtime()
  
& Floating point functions
  Floating point functions operate on floating point numbers. Most of
  them return a floating-point number as a result. Floating point
  results can have at most 6 decimal places of precision.
 
  These functions only exist if floating point computation is enabled.
  Check "@config" to see if they are.
 
  acos()        asin()        atan()        ceil()        cos()
  e()           exp()         fdiv()        floor()       log()
  ln()          pi()          power()       round()       sin()
  sqrt()        tan()
 
& List functions
  List functions take at least one list of elements and return transformed
  lists or one or more members of those lists. Most of these functions
  can take an arbitrary <delimiter> argument to specify what delimits
  list elements; if none is provided, a space is used by default.

  element()     elements()    extract()     first()       grab()
  graball()     index()       insert()      itemize()     items()
  iter()        last()        ldelete()     map()         match()
  matchall()    member()      mix()         munge()       remove()
  replace()     rest()        revwords()    setdiff()     setinter()
  setunion()    shuffle()     sort()        sortby()      splice()
  wordpos()     words()
    
  See also: LISTS
& Math functions
  Math functions take one or more numbers and return a numeric value.
  What is allowed as a 'number' depends on @config settings (see help).
  These functions can taken both integers and floating point numbers:
  abs()         add()         bound()       lmath()       max()         
  mean()        median()      min()         mul()         sign()        
  stddev()      sub()         trunc()       val()
 
  These functions operate only on integers (if passed floating point
  numbers, they will return an error or misbehave):
  dec()         dist2d()      dist3d()      div()         floordiv()
  inc()         mod()

  These functions operate only with floating point numbers:
  acos()        asin()        atan()        atan2()       ceil()
  cos()         e()           exp()         fdiv()        floor()
  fmod()        ln()          log()         pi()          power()
  round()       sin()         sqrt()        tan()

  These functions operate on n-dimensional vectors. A vector
  is a delimiter-separated list of numbers (space-separated, by default):
  vadd()        vdim()        vdot()        vmag()        vmax() 
  vmin()        vmul()        vsub()        vunit()
& Regular expression functions
  This functions take a regular expression (regexp, or re) and match
  it against assorted things.
  
  regedit()     regeditall() regeditalli()  regediti()    regmatch()
  regmatchi()   regrab()     regraball()    regraballi()  regrabi()
  regrep()      regrepi()
 
  See also: string functions, regexp
& String functions
  String functions take at least one string and return a transformed
  string, parts of a string, or a value related to the string(s).
  
  accent()      after()       alphamin()    alphamax()    art()
  before()      brackets()    capstr()      case()        caseall()
  cat()         center()      comp()        chr()         decrypt()
  delete()      edit()        encrypt()     escape()      if()
  ifelse()      lcstr()       left()        lit()         ljust()
  merge()       mid()         ord()         pos()         regedit()
  regmatch()    repeat()      reverse()     right()       rjust()
  scramble()    secure()      sha1()        space()       spellnum()    
  squish()      strcat()      strinsert()   stripaccent() stripansi()   
  strlen()      strmatch()    switch()      trim()        ucstr()       
  wrap()
 
  See also: STRINGS
& Time functions
  These functions return times or format times.
  
  convsecs()    convutcsecs() convtime()    ctime()       etimefmt()
  isdaylight()  mtime()       restarts()    restarttime() secs()
  starttime()   time()        timefmt()     timestring()  utctime()   

& Utility functions
  These functions don't quite fit into any other category.
  
  ansi()        atrlock()     beep()        checkpass()   clone()       
  create()      die()         dig()         functions()   isdbref()     
  isint()       isnum()       isword()      localize()    link()        
  list()        lnum()        mudname()     null()        objeval()     
  open()        pcreate()     r-function    rand()        restarts()    
  s-function    set()         setq()        setr()        soundex()     
  soundslike()  tel()         textfile()    valid()       version()     
  wipe()        @@()

& @@()
& NULL()
  @@(<expression>)
  null(<expression>)

  The @@() function does nothing and returns nothing. It could be
  used for commenting, perhaps. It does not evaluate its argument.

  The null() function is similar, but does evaluate its argument,
  so side-effects can occur within a null(). Useful for eating the
  output of functions when you don't use that output.
& ABS()
  abs(<number>)
 
  Returns the absolute value of a number. i.e. ABS(-4) returns 4;
  ABS(2) returns 2, etc.
& ACCENT()
  accent(<string>, <template>)

  The accent() function will return <string>, with characters in it
  possibly changed to accented ones according to <template>. Both
  arguments must be the same size.

  Whether or not the resulting string is actually displayed correctly
  is client-dependent. Some OSes uses different character sets than
  the one assumes (ISO 8859-1), and some clients strip these 8-bit
  characters.

  See HELP ACCENT2 for a description of the template argument.

  See also: stripaccents(), NOACCENTS
& ACCENT2
  For each character in <string>, the corresponding character of
  <template> is checked according to the table below, and a replacement
  done. If either the current <string> or <template> characters aren't
  in the table, the <string> character is passed through unchanged.

  Accent                         Template   String
  Name       Description         Character  Character
  --------------------------------------------------------------
  grave      Backward slant      `          A,E,I,O,U,a,e,i,o,u
             above letter
  acute      Forward slant       '          A,E,I,O,U,Y,a,e,i,o,u,y
             above letter
  tilde      Wavy line above     ~          A,N,O,a,n,o
             letter
  circumflex carat above         ^          A,E,I,O,U,a,e,i,o,u
             letter
  umlaut     Two dots above      :          A,E,I,O,U,,a,e,i,o,u,y
  diaeresis  letter
  ring       Small circle above  o          A,a
             letter
  cedilla    Small tail below    ,          C,c
             letter

  See HELP ACCENT3 for more
& ACCENT3
  These are non-accent special characters, mostly punctuation and
  non-roman letters.

                      Template   String
  Description         Character  Character
  --------------------------------------------------------------
  Upside-down ?       u          ?
  Upside-down !       u          !
  << quote mark       "          <
  >> quote mark       "          >
  German sharp s      B          s
  Capital thorn       |          P
  Lower-case thorn    |          p
  Capital eth         -          D
  Lower-case eth      &          o
  
  See HELP ACCENT4 for examples
& ACCENT4
  Some examples of accent() and their expected outputs:

  > think accent(Aule, ---:)
  Aul(e-with-diaeresis)

  > think accent(The Nina was a ship, The Ni~a was a ship) 
  The Ni(n-with-~)a was a ship

  > think accent(Khazad ai-menu!, Khaz^d ai-m^nu!)
  Khaz(a-with-^)d ai-m(e-with-^)nu!
& ACOS()
  acos(<cosine>[, <angle type>])
 
  Returns the angle that has the given <cosine> (arc-cosine), with the
  angle expressed in the given angle type, or radians by default.

  See HELP CTU() for more on the angle type.
& ADD()
  add(<number>,<number>,...)

  Returns the sum of some numbers. 
& AFTER()
  after(<string1>, <string2>)

  Returns the portion of <string1> that occurs after <string2>.
  If <string2> isn't in <string1>, the function returns a null string.
  This is case-sensitive.
 
  Examples:
   > think after(foo bar baz,bar)
    baz
   > think after(foo bar baz,ba)
   r baz

& ALPHAMAX()
  alphamax(<word1>, <word2>, <word3>, ...)

  Takes any number of arguments, and returns the word which is
  lexicographically biggest. I.e., which word would be last in 
  alphabetical order.

& ALPHAMIN()
  alphamin(<word1>, <word2>, <word3>, ...)

  Takes any number of arguments, and returns the word which is
  lexicographically smallest: the word that would be first in
  alphabetical order.

& AND()
& CAND()
  and(<boolean value 1>,<boolean value 2>[, ... , <boolean value N>])
  cand(<boolean value 1>,<boolean value 2>[, ... , <boolean value N>])
 
  Takes boolean values, and returns 1 if all of them are equivalent
  to true(1).  and() always evaluates all arguments (including side
  effects), while cand() stops evaluation after the first argument
  that evaluates to false.

  See also: BOOLEAN VALUES, or(), xor(), not()
& ANDFLAGS()
  andflags(<object>,<list of flags>)

  This function returns 1 if <object> has all the flags in a specified
  list, and 0 if it does not. The list is specified with a single letter
  standing for each flag, like the output of the FLAGS() function. A '!'
  preceding a flag letter means "not flag".
  
  Thus, ANDFLAGS(me,WD) would return 1 if I was set WIZARD and DARK.
  ANDFLAGS(me,W!Dc) would return 1 if I was set WIZARD, not DARK,
  and CONNECTED.
  
  If a letter does not correspond to any flag, <object> doesn't have
  it, so the function returns 0. There can be an arbitrary number of
  flags. Do not put spaces between flag letters.
& ANSI()
  ansi(<codes>,<string>)
 
  This allows you to highlight a string using ANSI terminal effects.
  The codes are:
 
        f - flash                       F - not flash
        h - hilite                      H - not hilite
        u - underscore                  U - not underscore
        i - inverse                     I - not inverse
        n - normal                      
 
        x - black foreground            X - black background
        r - red foreground              R - red background
        g - green foreground            G - green background
        y - yellow foreground           Y - yellow background
        b - blue foreground             B - blue background
        m - magenta foreground          M - magenta background
        c - cyan foreground             C - cyan background
        w - white foreground            W - white background
 
  For example, "ansi(fc, Test)" would hilight "Test" in flashing cyan.
 
  See also: ANSI, COLOR 
& APOSS()
  aposs(<object>)

  Returns the absolute possessive pronoun - his/hers/its/theirs -
  for an object.
& ART()
  art(<string>)

  This function returns the proper article, "a" or "an", based on whether
  or not <string> begins with a vowel.
& ASIN()
  asin(<sine>[, <angle type>])
 
  Returns the angle with the given <sine> (arc-sine), with the angle
  expressed in the given angle type, or radians by default.

  See HELP CTU() for more on the angle type.
& ATAN()
& ATAN2()
  atan(<tangent>[, <angle type>])
  atan2(<number>, <number>[<, <angle type>]) 

  Returns the angle with the given <tangent> (arc-tangent), with the
  angle expressed in the given angle type, or radians by default.

  atan2(y, x) is like atan(fdiv(y, x)), except x can be 0, and the
  signs of both arguments are used in determining the sign of the
  result. It is useful in converting between cartesian and polar
  coordinates.

  See HELP CTU() for more on the angle type.
& ATRLOCK()
  atrlock(<object>/<attrib>[, <on|off>])

  When given a single object/attribute pair as an argument, returns 1
  if the attribute is locked, 0 if unlocked, and #-1 if the attribute
  doesn't exist or can't be read by the function's caller.

  When given a second argument of "on" (or "off"), attempts to lock
  (unlock) the specified attribute, as per @atrlock.
& BAND()
  band(<integer>,<integers>,...)

  Does a bitwise AND of all its arguments, returning the result
  (A number with only the bits set in every argument set in it).
& BEEP()
  beep([<number>])
 
  Sends <number> "alert" bell characters. <number> must be in the range
  1 to 5, or, if unspecified, defaults to 1.
  This function may only be used by royalty and wizards. 
 
& BEFORE()
  before(<string1>, <string2>)
 
  Returns the portion of <string1> that occurs before <string2>.
  If <string2> isn't in <string1>, <string1> is returned.
  This is case-sensitive.
 
  Examples:
   > think before(foo bar baz,bar)
   foo
   > think before(foo bar baz,r)
   foo ba

& BRACKETS()
  brackets([<string>])

  Returns a count of the number of left and right square brackets, 
  parentheses, and curly braces in the string, in that order, as a
  space-separated list of numbers. This is useful for finding missing 
  or extra brackets in MUSH code. 

  Example:
  > @desc me=This is [ansi(h,a test)] of the { brackets() function.
  > think brackets(v(desc))
  1 1 2 2 1 0
& BNAND()
  bnand(<integer>, <integer>)

  Returns its first argument with every bit that was set in the second
  argument cleared.
& BNOT()
  bnot(<integer>)

  Returns the bitwise complement of its argument. Every bit set in it
  is cleared, and every clear bit is set.
& BOR()
  bor(<integer>, <integer>, ...)

  Does a bitwise OR of all its arguments, returning the result.
  (A number with a bit set if that bit appears in any of its arguments).
& BOUND()
  bound(<number>, <lower bound>, <higher bound>)

  bound() returns <number> if it is between <lower bound> and
  <higher bound>. If it's lower than the lower bound, the lower
  bound is returned. If it's higher than the higher bound,
  the higher bound is returned.
& BXOR()
  bxor(<integer>, <integer>,...)

  Does a bitwise XOR of all its arguments, returning the result.
  (A number with a bit set if it's set in only one of its arguments).
& CAPSTR()
  capstr(<string>)
  
  Returns <string> with the first character capitalized.
  Example: capstr(foo bar baz) returns "Foo bar baz"
& CAT()
  cat(<string1>,<string2>[,<string3>,<string4>,...])

  cat() concatenates strings, separating each string by a space.
  So "[cat(one, two)]" will return 'one two'.
& CEIL()
  ceil(<number>)
 
  Returns the least integral value greater than or equal to <number>.
& CEMIT()
  cemit(<channel>, <message>[, <noisy>])

  Sends a message to all players listening to the given chat channel.
  See help @cemit for details.

  If the third argument is a true value, the channel name will be
  prepended to the message, behaving like @cemit/noisy.
& CENTER()
  center(<string>,<width>[,<fill>])
 
  This function will center <string> within a field <width> characters wide,
  using <fill> characters for padding on either end of the string for
  centering. If <fill> is not specified, a space will be used.
 
  Example:
    > say center(X,5,-)
    You say, "--X--"
    > say center(.NEAT.,15)
    You say, "    .NEAT.      "

& CFLAGS()
  cflags(<channel>)
  cflags(<channel>,<object>)

  With one argument, cflags() returns a list of flags set on the
  given channel, represented as a string of characters. See
  'help channel-list' for the list of flags (they appear in the
  "Access" column). You must be able to see the channel to use this
  function.

  With two arguments, cflags() returns a list of flags for that
  object on that channel, currently a string consisting of zero
  or more of "G" (gagging), "Q" (muted), and "H" (hidden).
  You must be able to see that channel and to examine the object
  to use this function. If the object is not on the channel, an
  error is returned.
& CHANNELS()
  channels([<delimiter>])
  channels(<object>)
  channels(<object>[,<delimiter>])

  With no arguments, channels() returns the list of all channel names
  which are visible to the player. With two arguments, returns the list
  of channel names to which the object is listening, delimited by
  <delimiter>.

  With one argument, the behavior is ambiguous. If the argument
  matches an object, returns the list of names to which the object
  is listening, space-delimited. If not, it's treated as a no-argument
  case with a delimiter.

  If you don't have permission to examine the object, you only see 
  those channels to which the object belong for which you have 
  permission to join (or are joined to).
& CHECKPASS()
  checkpass(<player>,<string>)

  Returns 1 if <string> matches the player's password otherwise 0.
  If <player> has no password, this function will always return 1.
  <player> should be specified as a dbref or *<name>.

  This function is restricted to wizards.

& CHR()
& ORD()
  chr(<number>)
  ord(<character>)

  ord() returns the numerical value of the given character.
  chr() returns the character with the given numerical value.

  Examples:
  > think ord(A)
  65
  > think chr(65)
  A
& CLOCK()
  clock(<channel>[/<locktype>][, <new lock>])

  With one argument, returns the value of a lock on a channel.
  If no locktype is given, "JOIN" is assumed.
  With two arguments, sets the lock.

  See also: @clock
& CLONE()
  clone(<object>)
 
  This function clones <object>, and returns the dbref number of the clone.

  This is a side-effect function and may not be enabled on some MUSHes.
& COMP()
  comp(<value1>, <value2>[, <type>])

  Comp compares two values.  It returns 0 if they are the same, -1 if
  value1 is less than/precedes alphabetically value2, and 1 
  otherwise.

  By default the comparison is a case-sensitive lexicographic (string)
  comparison. By giving the optional <type>, the comparison can
  be specified:
      <type>            Comparison
        A               Case-sensitive lexicographic (default)
        I               Case-insensitive lexicographic
        D               Dbrefs of valid objects
        N               Integers
        F               Floating point numbers
& CON()
  con(<object>)

  Returns the dbref of the first object in a container.

  You can get the complete contents of any container you may examine,
  regardless of whether or not objects are dark.  You can get the
  partial contents (obeying DARK/LIGHT/etc.) of your current location
  or the enactor (%#).  You CANNOT get the contents of anything else,
  regardless of whether or not you have objects in it.

  See also: lcon(), next()
& CONFIG()
  config()
  config(<option>)

  With no arguments, this function returns a list of config option names.
  Given a config option name, this function returns its value.
  Boolean configuration options will return values of "Yes" or "No".

  Ex: config(money_singular) => "Penny"

& CONN()
  conn(<player name>)
 
  This function returns the number of seconds a player has been connected.
  <player name> must be the full name of a player, or a player's dbref.
  Players who are not connected have a conn value of "-1", as do dark
  wizards, when conn() is used on them by a non-priv'ed player.
 
  See also: CONNECTED
& CONTROLS()
  controls(<object>,<victim>)
  
  This function returns 1 if <object> controls <victim>, or 0, if
  it does not. If one of the objects does not exist, it will return
  #-1 ARGN NOT FOUND (where N is the argument which is the invalid
  object). You must control <object> or <victim>, or have the See_All
  power, to use this function.

  See also: CONTROL
  
& CONVSECS()
& CONVUTCSECS()
  convsecs(<seconds>[, <zone>])
  convutcsecs(<seconds>) 

  This function converts seconds to a time string, based on how many
  seconds the number is after Jan 1, 1970 UTC. Because it's based on
  UTC, but returns local time, convsecs(0) is not going to be
  "Thu Jan 1 00:00:00 1970" unless you're in the UTC (GMT) timezone.
 
  convutcsecs() and convsecs() with a second argument of 'utc' return
  the time based on UTC time instead of the server's local time.
  
  Example:
  > say [secs()]
  You say, "709395750"
  > say [convsecs(709395750)]
  You say, "Wed Jun 24 10:22:54 1992"
  > say [convutcsecs(709395750)]
  You say, "Wed Jun 24 14:22:30 1992"
  See also: convtime(), time()
& CONVTIME()
  convtime(<time string>)

  This functions converts a time string (in the local time zone) to the
  number of seconds since Jan 1, 1970 GMT. A time string is of the
  format: Ddd MMM DD HH:MM:SS YYYY where Ddd is the day of the week,
  MMM is the month, DD is the day of the month, HH is the hour in
  24-hour time, MM is the minutes, SS is the seconds, and YYYY is the
  year.  If you supply an incorrectly formatted string, it will return
  -1.

  If the extended convtime() is supported (See @config compile), more
  formats for the date are enabled, including ones missing the day
  of week and year, and a 'Month Day Year' format.

  Example:
  > say [time()]
  You say, "Wed Jun 24 10:22:54 1992"
  > say [convtime(Wed Jun 24 10:22:54 1992)]
  You say, "709395774"

  See also: convsecs(), time()
& COS()
  cos(<angle>[, <angle type>])
 
  Returns the cosine of <angle>. Angle must be in the given angle
  type, or radians by default. 

  Example:
  > say cos(90, d)
  You say, "0" 
  > say cos(1.570796)
  You say, "0"

  See HELP CTU() for more on the angle type.
& PCREATE()
  pcreate(<name>,<password>)

  Creates a player with a given name and password. Wizard-only.

  See also: @pcreate
& CREATE()
  create(<object>, <cost>)
 
  This function creates an object with name <object> for <cost> pennies,
  and returns the dbref number of the created object.

  This is a side-effect function and may not be enabled on some MUSHes.
& CTIME()
  ctime(<object>)
 
  If creation times are enabled, this function will return the 
  date and time that the object was created, if the player is
  able to examine the object.
& CTITLE()
  ctitle(<channel>,<object>)

  Returns <objects> @chan/title on <channel>. You must either
  be able to examine the object, or it must visible be on a channel
  which you are allowed to join.
& CTU()
  ctu(<angle>, <from>, <to>)

  Converts between the different ways to measure angles.
  <from> controls what the angle is treated as, and <to> what form
  it is turned into. They can be 'd' for degrees, or 'r' for radians.
  There is also a third way to measure angle, 'g' for gradians, but it's not
  used often and is only included for completeness.

  As a refresher, there are 180 degrees in pi radians in 200 gradians.

  Example:
  > say 90 degrees is [ctu(90, d, r)] radians
  You say, "90 degrees is 1.570796 radians"
& CWHO()
  cwho(<channel>)
 
  This returns a list of connected dbrefs who are on <channel>. 
  When used by mortals, hidden/DARK players do not appear on the list.
& DEC()
  dec(<integer>)
  dec(<string-ending-in-integer>)

  Dec returns the integer minus 1. If given a string that ends in an integer,
  it decrements only the final integer portion. That is:

  > think dec(3)
  2
  > think dec(hi3)
  hi2
  > think dec(1.3.3)
  1.3.2
  > think dec(1.3)
  1.2

  Note especially the last example, which will trip you up if you use
  floating point numbers with dec() and expect it to work like sub().
  See also: inc()
& DECRYPT()
  decrypt(<string>, <password>)

  Decrypts a string encrypted with the encrypt() function, if given
  the string and the same password.

& DEFAULT()
  Function:  default([<obj>/]<attr>,<default case>)
 
  This function returns the value of <obj>/<attr>, as if retrieved via
  the get() function, if the attribute exists and is readable by you.
  Otherwise, it evaluates the default case, and returns that.
  Note that the default case is only evaluated if the attribute does
  not exist or cannot be read. Note further than an empty attribute
  counts as an existing attribute.
 
  This is useful for code that needs to return the value of an attribute,
  or an error message or default case, if that attribute does not exist.
 
  Examples:
    > &TEST me=apple orange banana
    > say default(me/Test, No fruits!)
    You say "apple orange banana"
    > &TEST ME
    > say default(me/Test, No fruits!)
    You say "No fruits!"
 
  See also: get(), eval(), ufun(), edefault(), udefault(), uldefault()
 
& DELETE()
  delete(<string>, <first>, <len>)
 
  Return a modified <string>, with <len> characters starting after the
  character at position <first> deleted. In other words, it copies <first>
  characters, skips <len> characters>, and then copies the remainder of
  the string.
 
  Example:
    > say [delete(abcdefgh, 3, 2)]
    You say, "abcfgh"
 
& DIE()
  die(<number of times to roll die>, <number of sides on die>[, <show>])
 
  This function simulates rolling dice. It "rolls" a die with a given
  number of sides, a certain number of times, and sums the results.
  For example, DIE(2, 6) would roll "2d6" - two six-sided dice,
  generating a result in the range 2-12. The maximum number of
  dice this function will roll in a single call is 20.
  If a third argument is given and it's a true value, the result will
  be a space-seperated list of the individual rolls rather than their
  sum.

  Example:
  > think die(3, 6)
  6
  > think die(3, 6, 1)
  5 2 1  
& DIG()
  dig(<name> [, <exit to> [, <exit from>]])
 
  This function digs a room called <name>, and optionally opens and links
  <exit to> and <exit from>, like the normal @dig command. It returns
  the dbref number of the new room.

  This is a side-effect function and may not be enabled on some MUSHes.
& DIST2D()
  dist2d(x1, y1, x2, y2)

  Returns the distance between two points in the Cartesian
  plane that have coordinates (x1, y1) and (x2, y2). 
& DIST3D()
  dist3d(x1, y1, z1, x2, y2, z2)

  Returns the distance between two points in space, with
  coordinates (x1, y1, z1) and (x2, y2, z2).
& DIV()
& FLOORDIV()
  div(<number>,<number>)
  floordiv(<number>,<number>)
 
  Div returns the integer part of the quotient of the first number
  divided by the second number.  Floordiv returns the largest integer
  less than or equal to the quotient of the first number divided by
  the second.  For positive numbers, these are the same thing, but
  for negative numbers they may be different:

   div(13,4)          ==>  3       and     floordiv(13,4)     ==>  3
   div(-13,4)         ==>  -3      but     floordiv(-13,4)    ==>  -4
   div(13,-4)         ==>  -3      but     floordiv(13,-4)    ==>  -4
   div(-13,-4)        ==>  3       and     floordiv(-13,-4)   ==>  3

  Note that add(mul(div(%0,%1),%1),remainder(%0,%1)) always yields %0,
  and add(mul(floordiv(%0,%1),%1),modulo(%0,%1)) also always yields %0.

  See also: MODULO
& DOING()
  doing(<player>)

  Given the name of a connected player, returns that player's @doing
  string if they can be seen on the WHO list.

  See also: @poll, @doing, poll()
& E()
  e()
 
  Returns the value of "e"  (2.71828182845904523536, rounded to the
  game's float_precision setting).
& EDEFAULT()
  Function:  edefault([<obj>/]<attr>,<default case>)
 
  This function returns the evaluated value of <obj>/<attr>, as if
  retrieved via the get_eval() function, if the attribute exists and
  is readable by you. Otherwise, it evaluates the default case, and
  returns that. The default case is only evaluated if the attribute
  does not exist or cannot be read.
 
  Example:
    > &TEST me=You have lost [rand(10)] marbles.
    > say edefault(me/Test,You have no marbles.)
    You say "You have lost 6 marbles."
    > &TEST me
    > say edefault(me/Test,You have no marbles.)
    You say "You have no marbles."
  
  See also: get(), eval(), ufun(), default(), udefault()
 
& EDIT()
  edit(<string>, <search>, <replace>[, <search2>, <replace2> ...])
 
  This functions in a similar way to the @edit command; instead of
  taking an attribute from an object, it takes an arbitrary string.
  It searches the string for <search> and replaces with <replace>,
  then repeats the process if additional search-replace pairs are
  given.

  If <search> is a caret (^), <replace> is prepended.
  If <search> is a dollar sign ($), <replace> is appended.
  If <search> is an empty string, <replace> is inserted between
  every character, and before the first and after the last.
  If <replace> is an empty string, <search> is deleted from the string.

  Example:
  > say [edit(this is a test,^,I think%b,$,.,a test,an exam)]
  You say "I think this is an exam." 

  edit() can not replace a literal single ^ or $. Use regedit() for that.
  
  See also: @edit, regedit()
& ELEMENT()
  element(<list>,<item>,<single-character separator>)
  
  This returns the position of <item> in <list>, where <list>'s items
  are separated by <separator>. A wildcard match is done, so this 
  function behaves much like MATCH(), except its separator argument
  is required, not optional.
  
  Example:
    > say [element(this|is|a|test|string,is,|)]
    You say, "2"

  See also: match(), grab()
& ELEMENTS()
  elements(<list of words>,<list of numbers>[,<delim>][, <osep>])
 
  This function returns the words in <list of words> that are in the
  positions specified by <list of numbers>. Optionally, a list delimiter
  other than a space can be used.
 
  Examples:
    > say elements(Foo Ack Beep Moo Zot,2 4)
    You say "Ack Moo"
    > say elements(Foof|Ack|Beep|Moo,3 1,|)
    You say "Beep|Foof"

  See also: extract(), index(), grab()
& ELOCK()
  elock(<object>[/<locktype>], <victim>)

  elock() returns 1 if the <victim> would pass the lock on <object>,
  and 0 if it would fail. You must control <object>.
  
  You can also provide a switch after <object> if you wish to check
  something other than the basic lock. This can be used to test
  user-defined locks. elock() can take as many switches as @lock.

  For example:
      @lock/drop Dancing Slippers=#0
      think elock(Dancing Slippers/drop, Princess)
      > 0
  
  See also: @lock, locktypes
& EMIT()
  emit(<message>)

  Sends a message to the room, as per @emit.

& ENCRYPT()
  encrypt(<string>, <password>) 

  Returns an encrypted string produced by a simple password-based
  encrypted algorithm. Good passwords are long passwords.
  This is not high-security encryption.  See also decrypt().
& ENTRANCES()
  entrances([<object> [,<type> [,<begin> [,<end>]]]])

  With no arguments, the entrances() function returns a list of all
  exits, things, players, and rooms linked to your location, like
  @entrances. You can specify an object other than your current location
  with <object>. You can limit the type of objects found by specifying
  <type> as follows:
        a        all (default)
        e        exits
        t        things
        p        players
        r        rooms
  You can also limit the range of the dbrefs searched by giving <begin>
  and <end>.

  This function is computationally expensive and costs the same as
  @find. You must control the object in order to perform entrances()
  on it.         
& EQ()
  [eq(<integer1>,<integer2>)]

  Takes two integers, and returns 1 if they are equal, 0 otherwise.
  Will not work with characters.
  
  See also: neq(), match()
& ESCAPE()
  escape(<string>)
 
  The ESCAPE() function "escapes out" potentially "dangerous" characters,
  preventing function evaluation in the next pass of the parser. It 
  returns <string> after adding the escape character ('\') at the 
  beginning of the string, and before the following characters:
  %  ;  [  ]  {  }  \
  
  This function prevents strings entered by players from causing side 
  effects, such as performing an unintended GET() of an attribute. It
  is only needed when the resulting string will be passed through @force
  or used as an attribute for an object (like the description of a mail
  message object).  Since the function preserves the original string, 
  it is, in most cases, a better choice than SECURE().
  
& EVAL()
& GET_EVAL()
  eval(<object>, <attribute>)
  get_eval(<object>/<attribute>)
 
  Eval() works the same way as xget(), except that it performs %-substitutions
  and function evaluation on the attribute before returning the value. eval()
  does not modify the stack (%0-%9), so the attribute being evaled sees the
  same values for them that the calling code does. Unless you need this behavior,
  it is better to use u() instead, which hides the caller's stack.

    Example:
      &TEST me=%B%B%B-[name(me)]
      think xget(me,test)
      > %B%B%B-[name(me)]
      think eval(me,test)
      >    -Shalott

  Get_eval() does the same thing, except it uses the format of get() instead
  of xget() -- using a slash rather than a comma to separate the object from
  the attribute. It is included for TinyMUSH 2.x compatibility.
  
  See also: get(), u(), xget()
& EXIT()
  exit(<object>)

  Returns the dbref of the first exit in a room.

  You can get the complete exit list of any room you may examine,
  regardless of whether or not exits are dark.  You can get the partial
  exit list (obeying DARK/LIGHT/etc.) of your current location or the
  enactor (%#).  You CANNOT get the exit list of anything else,
  regardless of whether or not you have objects in it.

  See also: lexits(), next()
& EXP()
  exp(<number>)
 
  Returns e to the power of <number>.
& EXTRACT()
  extract(<string>,<first>,<length>[,<delimiter>])

  Extract returns a string of length words, starting with the first 
  word. Unlike letters, the first word in a string is number 1, 
  instead of 0.

  A word is assumed to be defined as a string beginning and ending 
  with a space, or a string w/o any interior spaces.

  For example:
    think extract(This is a test string,3,2)
    > a test

  See also: index(), elements(), grab()
& FDIV()
  fdiv(<numerator>,<denominator>)
 
  Returns the quotient of the two numbers. Note that the DIV() and MOD()
  functions cannot be used on floating point numbers.
& FILTER()
& FILTERBOOL()
  filter([<obj>/]<attr>, <list>[,<delimiter>][,<osep>])
  filterbool([<obj>]/<attr>, <list>[, <delimiter>][,<osep>])  

  This function returns the elements of <list> for which a user-defined
  function evaluates to "1", or to a boolean true value if filterbool()
  is used. That function is specified by the first argument (just as
  with the ufun() function), and the element of the list being tested is
  passed to that user-defined function as %0.
  
  Thus, "filter(obj/attr, x1 x2 x3)" is nearly equivalent to
  "iter(x1 x2 x3, switch(ufun(obj/attr, ##),1,##,))"
  though the iter version may have extra blank spaces.
  
  Example:
  
    > &IS_ODD test=[mod(%0,2)]
    > say [filter(test/is_odd, 1 2 3 4 5 6)]
    You say, "1 3 5"
& FINDABLE()
  findable(<object>,<victim>)
 
  This function returns 1 if <object> can locate <victim>, or 0, if
  it cannot. If one of the objects does not exist, it will return
  #-1 ARGN NOT FOUND (where N is the argument which is the invalid
  object).
 
& FIRST()
  first(<string>[,<delimiter>])

  Returns the first word of a string, that is, everything to the left
  of the first space in the string, or the entire string if there are
  no spaces in the string.  See REST, LAST.
& FLAGS()
  flags(<object>)
  flags(<object>/<attribute>)

  Flags returns a string consisting of the flags attached to the 
  object or the attribute on the object. The string is a single word
  made up of all the appropriate flag letters.
& FLIP()
& REVERSE()
  flip(<string>)
  reverse(<string>)

  This function reverses a string. For example, "flip(foo bar baz)"
  returns "zab rab oof".
& FLOOR()
  floor(<number>)
 
  Returns the greatest integral value less than or equal to <number>.
& FMOD()
  fmod(<number>,<divisor>)

  Identical to mod() but may take floating point arguments. The return
  value is the (possibly floating point) smallest positive remainder
  left after subtracting the largest number of multiples of <divisor>
  from <number>.

  Example:
  > think fmod(6.1,2.5)
  1.1
& FOLD()
  fold([<obj>/]<attr>, <list>[, <base case>][,<delimiter>])
  
  This function "folds" a list through a user-defined function, specified
  by the first argument to fold(), which is analogous to ufun()'s first
  argument.
  
  If no base case is provided, fold() passes the first element of <list>
  as %0, and the second element of <list> as %1, to the user-defined
  function. The user-defined function is then called again, with the
  result of the first evaluation being %0, and the next (third) element
  of the list as %1. This is repeated until all the elements of the 
  list have been used.
  
  If a base case is provided, it is passed as %0, and the first element
  of list is passed as %1, to the user-defined function. The process for
  the no-base-case fold() is then used.
  
  See 'help FOLD2' for examples.
 
& FOLD2
 
  Examples:
  
    > &REP_NUM test=%0[repeat(%1,%1)]
    > say [fold(test/rep_num,1 2 3 4 5)]
    You say, "122333444455555"
    > say [fold(test/rep_num,1 2 3 4 5,List:)]
    You say, "List:122333444455555"
  
    > &ADD_NUMS test=add(%0,%1)
    > say [fold(test/add_nums,1 2 3 4 5)]
    You say, "15"
& FOLDERSTATS()
  folderstats()
  folderstats(folder#)
  folderstats(player)
  folderstats(player,folder#)

  FOLDERSTATS() returns the number of read, unread, and cleared messages
  in a specific folder, or, if none is given, the player's current
  folder. Only Wizards may use forms which get other players' mail
  information.
& FOLLOWERS()
  followers(<object>)

  Returns the list of things and players following object. You must
  control object.
& FOLLOWING()
  following(<object>)

  Returns the list of things and players that the object is following.
  You must control object.
& FOREACH()
  foreach([<object>/]<attribute>,<string>[,<start>[,<end>]])
 
  Maps a function onto a string.
 
  Each character in <string> has the user-defined function of the first
  argument performed on it; the character is passed to the function as
  %0, and its position in the string as %1 (the first character has 
  position 0). The results are concatenated. If a start character is given,
  everything before that character is copied without passing it to the
  function, and everything after it until the end of the string or an end
  character is passed to the function. Anything left after the end character
  is also copied unevaluated. The start and end characters themselves are 
  not copied.
 
Continued in HELP FOREACH2
& FOREACH2
  Examples:
 
    > &add_one me=[add(%0,1)]
    > say [foreach(add_one, 54321)]
    You say, "65432"
 
    > say [foreach(add_one, This is #0# number, #, #)]
    You say, "This is 1 number"

    > &is_alphanum me=[regmatch(%0, \[\[:alnum:\]\])]%b
    > say [foreach(is_alphanum,jt1o+)]
    You say, "1 1 1 1 0 "
 
& FULLNAME()
  fullname(<object>)

  Fullname() returns the name of object <object>. It is identical to
  name() except that for exits, fullname() returns the complete
  exit name, including all aliases.
  
  >"[fullname(south)]
  You say, "South;sout;sou;so;s"

  Related functions: NAME(), INAME()
& FUNCTIONS()
  functions()

  Returns a space-separated list of all function names.
& GET()
  get(<object>/<attribute>)

  The get function will be replaced by the string stored in the
  attribute of the object. You may get the attributes of objects you
  control, the attributes you control on other objects, and publicly
  accessible attributes.
  
& GRAB()
& REGRAB()
& REGRABI()
  grab(<list>, <pattern>[, <delimiter>])
  regrab(<list>, <regexp>[, <delimiter>])
  regrabi(<list>, <regexp>[, <delimiter>])
  
  This function returns the first word in list which matches the pattern.
  For grab(), the pattern is specified as in match(); i.e., it 
  can contain wildcards. For regrab(), the pattern is a regular expression.
  regrabi() is case-insensitive.
  
  Basically, this is a much more efficient way to do:
  extract(list, match(list, pattern, delimiter), 1) or
  extract(list, regmatch(list, regexp, delimiter), 1)

  See also: match(), extract(), element(), elements(), index(), regmatch()
& GRABALL()
& REGRABALL()
& REGRABALLI()
  graball(<string>,<pattern>[,<delim>][,<output seperator])
  regraball(<string>,<regexp>[,<delim>][,<output seperator])
  regraballi(<string>,<regexp>[,<delim>][,<output seperator])
  
  These functions work identically to the grab() and regrab()/regrabi()
  functions, save that they return all matches, not just the first: They 
  return all words in the list <string> which match <pattern>. 
  If none match, an empty string is returned.
  
  Examples:

  > say graball(This is a test of a test,test)
  You say "test test"
  > say graball(This is testing a test,tes*)
  You say "testing test"
  > say regraball(This is testing a test,s$)
  You say "This is"
  
  See also: match(), matchall(), grab(), regmatch()
& GREP()
& REGREP()
  grep(<object>,<attrs>,<pattern>)
  regrep(<object>,<attrs>,<regexp>)
  
  This function returns a list of attributes on <object> containing
  <pattern> (or matching <regexp>).  <attrs> is a wildcard pattern for
  attribute names to search; if you want to search all attributes, use "*".

  The list returned is similar to that returned by @grep/list
  <object>/<attrs>=<pattern>

  Parsing _does_ occur before this function is invoked. Therefore,
  "special" characters will need to be escaped out.  In grep(), 
  <pattern> is NOT wildcard matched.

  These functions are case-sensitive. grepi()/regrepi() are case-insensitive.
& GREPI()
  grepi(<object>,<attrs>,<pattern>)
  regrepi(<object>,<attrs>,<regexp>)
 
  This function works exactly like grep or regrep, but is case-insensitive.
  See "help grep()" or "help regrep()" for details. 
& GT()
  [gt(<num>,<num>)]

  Takes two numbers, and returns 1 if and only if the first is greater
  than the second, and 0 otherwise.
& GTE()
  [gte(<num>,<num>)]

  Takes two numbers, and returns 1 if and only if the first is greater
  than or equal to the second, and 0 otherwise.
& HASATTR()
& HASATTRP()
& HASATTRVAL()
& HASATTRPVAL()
  hasattr(<object>, <attribute name>)
  hasattrp(<object>, <attribute name>)
  hasattrval(<object>, <attribute name>)    
  hasattrpval(<object>, <attribute name>)   
  
  The hasattr() functions check to see if an object has an attribute.
  They return #-1 if the object does not exist or the attribute can't
  be examined by the player. Otherwise, they return 1 if the attribute
  is present and 0 if it is not.

  hasattr() returns 1 if the object has the attribute, 0 if it doesn't.
  
  hasattrp() also checks for attributes inherited from parent objects.

  hasattrval() returns 1 if the attribute exists and isn't empty.
  
  hasattrpval() is hasattrval() but checks parents.
  
& HASFLAG()
  hasflag(<object>[/<attrib>], <flag name>)
 
  Returns 1 if the object has the named flag, and 0 if it does not.
  If the object does not exist, #-1 will be returned. You do not have
  to control the object.
 
  Example: hasflag(me, opaque) will return "1" or "0".

  Unlike orflags() and andflags(), hasflag uses the *flag name*, not
  the single character abbreviation. Many flag names have shorter
  abbreviations which will also work (W for Wizard, roy for royalty).
  
  The "flags" ROOM, EXIT, and PLAYER are actually types. If you want
  to check if an object "has" one of these flags, you must use the
  HASTYPE() function.

  If an attribute is given, checks to see if the attribute has the 
  given attribute flag. See help @set2 for attribute flag names.

& HASPOWER()
  haspower(<object>, <power name>)
 
  Returns 1 if the object has the named power, and 0 if it does not.
  If the object does not exist, #-1 will be returned. 

  You may or may not have to be able to examine the object to use this.
& HASTYPE()
  hastype(<object>, <type>)

  Returns 1 if the object is of the named type, otherwise 0.
  Valid types are: ROOM, EXIT, PLAYER, THING.
  If an invalid type is given, #-1 is returned.
& HIDDEN()
  hidden(<player>)

  Returns 1 if the player is hidden, otherwise 0.
  Can only be called by someone privileged to see hidden players.
  If you're not, #-1 is returned.
& HOME()
  home(<object>)
 
  Returns the object's 'home'.  This is the home for a player or thing,
  the drop-to of a room, or source of an exit.
& IDLE()
& IDLESECS()
  idle(<player name>)
  idlesecs(<player name>)
 
  This function returns the number of seconds a player has been idle,
  much as WHO does. <player name> must be the full name of a player, or
  a player's dbref. Players who are not connected have an idlesecs of "-1",
  as do dark wizards, when idle() is used on them by a non-priv'ed player.

& IF()
& IFELSE()
  if(<condition>, <true expression>[, <false expression>])
  ifelse(<condition>, <true expression>, <false expression>)

  These functions evaluate the <condition> and return <true expression>
  if the <condition> is true, or <false expression> (if provided) if the
  <condition> is false.

  See also:  BOOLEAN VALUES, switch()
& INAME()
  iname(<object>)

  iname() returns the name of object <object>, as it would appear if
  you were inside it. It is identical to name() except that if the
  object has a NAMEFORMAT or NAMEACCENT attribute, it is used.

  You must be see_all, control <object>, or be inside it to use this
  function.

  See also: @nameformat, name(), fullname()
& INC()
  inc(<integer>)
  inc(<string-ending-in-integer>)

  Inc returns the integer plus 1. If given a string that ends in an integer,
  it increments only the final integer portion. That is:

  > think inc(3)
  4
  > think inc(hi3)
  hi4
  > think inc(1.3.3)
  1.3.4
  > think inc(1.3)
  1.4

  Note especially the last example, which will trip you up if you use
  floating point numbers with inc() and expect it to work like add().
  See also: dec()
& INDEX()
  index(<list>,<character>,<first>,<length>)
  
  This function is similar to EXTRACT(), except that it requires a 
  separator argument, while EXTRACT() uses a space if a separator
  isn't given. The function returns <length> items starting from 
  the <first> position. Trailing spaces are trimmed. The comma cannot
  be used as the <character> separator unless it's escaped with a \. 
  
  Examples:
  
    > say [index(Cup of Tea | Mug of Beer | Glass of Wine, |, 2, 1)]
    You say, "Mug of Beer"

    > say [index(%rtoy boat^%rblue tribble^%rcute doll^%rred ball,^,2,2)]
    You say, "
    blue tribble^
    cute doll"

  See also: extract(), elements(), grab()
& INSERT()
  insert(<list>,<position>,<new item>[,<single-character separator>])
  
  This inserts before the item of <list> at <position> the <new item>.
  That means that <new item> then becomes the <position>th element of
  <list>. If a separator is not given, a space is assumed.
  
  Examples:
    > say [insert(This is a string,4,test)]
    You say, "This is a test string"
    > say [insert(one|three|four,2,two,|)]
    You say, "one|two|three|four"
  
& ISDAYLIGHT()
  isdaylight()

  Returns 1 if it's daylight savings time in the MUSH time zone,
  otherwise 0.
& ISDBREF()
  isdbref(<string>)
 
  This function returns 1 if the string is a valid object dbref, and
  0 if the string is not a valid object dbref.
 
  See also: DBREFS
& ISINT()
  isint(<string>)

  Returns 1 if its argument is an integer, and 0 otherwise. Integers can
  begin with a '+' or '-' sign, but the rest of the string must be digits.

  See also: isnum()
& ISNUM()
  isnum(<string>)

  This function returns 1 if <string> is a number, and 0 if it is not.
  Numbers can begin with a '-' sign (for negatives), but the rest of
  the characters in the string must be digits, and an optional decimal
  point.

  See also: isint()
& ISWORD()
  isword(<string>)
  
  This function returns 1 if every character in <string> is a letter,
  or 0, if any character isn't a letter.  Case does not matter.
    
& ITEMS()
  items(<list>,<single-character separator>)

  items() counts the number of items in a list using an arbitrary
  (required) separator. Null items are counted, so:

        items(X|X,|)     => 2     (2 X items)
        items(X||X,|)    => 3     (2 X items and 1 null item)
        items(X X,%b)    => 2     (2 X items)
        items(X%b%bX,%b) => 3     (2 X items and 1 null item)
        items(,|)        => 1     (a single null item)

   Another way to think about this is that items() counts the number
   of delimiters in the string, and adds 1.

& ITEMIZE()
& ELIST()
  itemize(<list>[,<delim>[,<conjunction>[,<punctuation>]]])
  elist(<list>[,<conjunction> [,<delim> [,<output delim> [,<punctuation>]]]])

  These functions take the elements of <list> (separated by <delim> or
  a space by default), and:
   If there's just one, return it.
   If there's two, return <e1> <conjunction> <e2>
   If there's more than two, return <e1><punc> <e2><punc> ... <conj> <en>
   
  The default <conjunction> is "and", default punctuation is ","
  Examples:
    > say [itemize(eggs)] * [itemize(eggs bacon)]
    You say, "eggs * eggs and bacon" 
    > say [itemize(eggs bacon spam)]
    You say, "eggs, bacon, and spam"
    > say [itemize(eggs bacon spam, ,&,;)]
    You say, "eggs; bacon; & spam"
& ITER()
& PARSE()
  iter(<list>,<pattern>[,<delimiter> [,<output separator>]])
  parse(<list>,<pattern>[,<delimiter> [,<output separator>]])
  
  This works in a manner very similar to @map, except that it returns
  a string directly.  <list> is a space-separated list of words, and
  <pattern> is what will be "mapped" onto each element of the list,
  with the token "##" being replaced successively by the next word in
  the list, and the token "#@" being replaced by the word's position
  in the list (see also help itext() and help inum()).  The result is
  concatenated and returned as a space separated list.  This is similar
  to @dolist, but the results are made into a list rather than executed.

  The list may be <delimiter>-separated.

  By default, the return list will be space-separated. However,
  by including the output separator (which requires explicitly
  including the delimiter), you can have it separated by any string.

Continued in HELP ITER2
& ITER2   
  parse() is a synonym for iter(). If you nest iters, ## and #@ refer
  to the first iter(). See 'help ITEXT()' and 'help INUM()' for how to
  retrieve their values for any nested iter. See 'help MAP()' for a
  similar function. 

  Note that ## and #@ are replaced before evaluation, so the word will
  be evaluated, which can be a problem when iter()ing on an untrusted
  list.  iter-with-itext or map() should be preferred to iter-with-##
  whenever you're iterating over user-provided values.

  > say [iter(This is a test string., [strlen(##)])]
  You say, "4 2 1 4 7"
  
  > say [iter(lnum(5), mul(add(##,##),2))]
  You say, "0 4 8 12 16"
  
  > say [iter(lexits(here), [name(##)] (owned by [name(owner(##))]))]
  You say, "South (owned by Claudia) North (owned by Roy)"
  
  > &STRLEN_FN me=[strlen(%0)]
  > say [iter(This is a test string., [u(STRLEN_FN, ##)])]
  You say, "4 2 1 4 7"

 This example could be replaced by the use of map() like so:
  > say [map(strlen_fun, This is a test string)]

  > say [iter(lnum(3), ##, ,%r)]
  You say, "0
  1
  2"
& ILEV()
& ITEXT()
& INUM()
  ilev()
  itext(<n>)
  inum(<n>)

  These functions, when called within an iter(), return the equivalent
  of ## (itext) or #@ (inum), with reference to the nth more outermost
  iter(), where n=0 refers to the current iter(), n=1 to an iter()
  in which the current iter() is nested, etc. ilev() will return the
  current nesting depth, or -1 if it is outside an iter(). Thus,
  itext(ilev()) will return the ## of the outermost iter().

  > say [iter(red blue green,iter(fish shoe, #@:##))]
  You say, "1:red 1:red 2:blue 2:blue 3:green 3:green"
  
  > say [iter(red blue green,iter(fish shoe, [inum(ilev())]:[itext(1)]))]
  You say, "1:red 1:red 2:blue 2:blue 3:green 3:green"

  > say [iter(red blue green,iter(fish shoe, [inum(0)]:[itext(0)]))]
  You say, "1:fish 2:shoe 1:fish 2:shoe 1:fish 2:shoe"
  
  > say [iter(red blue green,iter(fish shoe, [itext(1)]:[itext(0)]))]
  You say, "red:fish red:shoe blue:fish blue:shoe green:fish green:shoe"
& LAST()
  last(<string>[,<delimiter>])
  
  Returns the last word of a string, that is, everything to the right
  of the last space in the string, or the entire string if there are
  no spaces in the string.  See FIRST, REST.
& LATTR()
  lattr(<object>[/<attribute pattern>])
 
  Returns a space-separated list of the attribute names on the object.
  You must either be a Wizard or Royalty, own the object, have the
  See_All power, or have the object set VISUAL in order to use this 
  function on the object.
  
  If a wildcarded attribute pattern is provided, only attribute names
  matching that pattern will be returned.

& NATTR()
& ATTRCNT()
  nattr(<object>)
  attrcnt(<object>) 

  This function (known by two names) returns the number of attributes
  on the object. You must have permission to examine the object
  in order to use this function, but its count may include attributes
  that are not visible to you.  This function is considerably faster
  than words(lattr()) and doesn't suffer from buffer length constraints.
  It's designed primarily for statistical purposes.

  See also: lattr()
& LCON()
  lcon(<object>)

  Returns a list of the dbrefs of contents in a container.

  You can get the complete contents of any container you may examine,
  regardless of whether or not objects are dark.  You can get the
  partial contents (obeying DARK/LIGHT/etc.) of your current location
  or the enactor (%#).  You CANNOT get the contents of anything else,
  regardless of whether or not you have objects in it.

  See also: lexits(), con(), next()
& LCSTR()
  lcstr(<string>)

  Returns <string> with all letters converted to lowercase.
  Example: lcstr(Foo BAR bAz) returns "foo bar baz"
& LDELETE()
  Ldelete(<list>,<position>[,<single-character separator>])
  
  This deletes the item at <position> in the list. If a separator
  character is not given, a space is assumed.
  
  Examples:
    > say [ldelete(This is a long test string,4)]
    You say, "This is a test string"
    > say [ldelete(lemon|orange|apple,2,|)]
    You say, "lemon|apple"
& LEFT()
  left(<string>, <length>)

  Returns the first <length> characters from string.

& LEMIT()
  lemit(<message>)

  Sends a message to the outermost room, as per @lemit.

& LEXITS()
  lexits(<object>)

  Returns a list of the dbrefs of exits in a room.

  You can get the complete exit list of any room you may examine,
  regardless of whether or not exits are dark.  You can get the partial
  exit list (obeying DARK/LIGHT/etc.) of your current location or the
  enactor (%#).  You CANNOT get the exit list of anything else,
  regardless of whether or not you have objects in it.

  See also: lcon(), exit(), next(), lvexits()
& LJUST()
  ljust(<string>,<length>[,<fill>])
  
  This function pads a string with trailing characters ("left-justifies")
  so it is <length> long. If <string> is longer than <length>, the <string> 
  is returned; it is not truncated. If <fill> is not specified, a space
  is used.
  
  Examples:
  
    > say [ljust(foo,6)]
    You say, "foo   "
  
    > say %r0[ljust(foo,6,-)]7%r01234567
    You say, "
    0foo---7
    01234567"
 
& LINK()
  link(<name>, <destination>)
 
  This function links object <name> to <destination>. While normally
  used on exits, it has all of the other capabilities of @link as well.
  It returns nothing.

  This is a side-effect function and may not be enabled on some MUSHes.
& LIST()
  list(<option>)
 
  This function takes the same arguments as the @list command, and returns
  the same things. 
& LIT()
  lit(<string>)

  This function returns the string literally - without even squishing
  spaces, and without evaluating *anything*. This can be useful for
  writing ASCII maps with spaces or whatever.

  It can be a bit tricky to get a literal string with spaces into an
  attrib, however, since spaces are usually squished in setting an
  attribute. This example illustrates how to make it work:

    > @va me=$test: think {[lit(near       far)]}
    Set.
    > ex me/va
    VA [#1]: $test: think {[lit(near       far)]}
    > test
    near       far

  Leaving out the {}'s will not work in the above.
& LMATH()
  lmath(<op>, <list>[, <delim>])

  This function performs generic math operations on <list>, returning
  the result. Each element of the list is treated as one argument to
  an operation, so that lmath(<op>, 1 2 3) is equivalent to <op>(1, 2, 3).
  Using @function, one can easily write ladd, lsub, etc as per TinyMUSH.

  Supported <op>'s are: add and band bor bxor div fdiv max mean 
  median min modulo mul nand nor or remainder stddev sub xor

  Example:
  >think lmath(add, 1|2|3, |)
  6
  >think lmath(max, 1 2 3)
  3
  >&FUN_FACTORIAL me=[lmath(mul,lnum(1,%0))]
  >think u(fun_factorial,5)
  120
& LN()
  ln(<number>)
 
  Returns the natural log of <number>.
& LNUM()
  lnum(<number>)
  lnum(<start number>,<end number>[,<output separator>])

  With one argument, lnum returns a list of numbers, from 0 to <number - 1>. 
  For example, lnum(4) returns the list "0 1 2 3". This is useful for 
  creating loops.
  With two arguments, the numbers range from the first to the second
  argument. For example, lnum(1,4) => 1 2 3 4
  With three arguments, the output is separated by the separator
  given in the third argument. lnum(1,4,|) => 1|2|3|4

& LOC()
  loc(<object>)
  
  Loc returns the dbref of the location that object is at.  The 
  object has to either be yours or be in the same room as you to 
  work. The location of an exit is its destination (the source of 
  an exit is its home). The location of a room is its drop-to
  (if one is not set, then the location is #-1).
& LOCALIZE()
  localize(<code>)

  Localize() saves the q-registers, evaluates its argument, and restores
  the registers afterwards. It has much the same relation to s() that
  ulocal() does to u(), except localize()'s argument is only evaluated
  once, instead of twice like s()'s. Useful in @functions or to wrap around
  fragments of code too small to go into another attribute.

  Example:
  > say [setr(0, Outside)]-[s(\[setr(0, Inside)\])]-%q0
  You say, "Outside-Inside-Inside"
  > say [setr(0, Outside)]-[localize(setr(0, Inside))]-%q0
  You say, "Outside-Inside-Outside"

  See also: setq(), setr(), r(), ulocal(), uldefault(), s()
& LOCATE()
  locate(<looker>, <name>, <parameters>)
 
  This function attempts to find the number called <name> relative to
  <looker>. You must control <looker> or have the See_All power. 
  This is a bit like the NUM() function, but with a wider, controllable 
  "range". 
 
  You can control the preferred type of the match with:
    E   -   Exits
    L   -   Unlocked exits preferred over locked exits
    N   -   No type (this is the default)
    P   -   Players
    R   -   Rooms
    T   -   Things
    F   -   Return #-1 if what's found is of a different type than the
            preferred one.
    X   -   Never return #-2. Use the last dbref found if the match is
            ambiguous.
  If you specify more than one type, the last one will be preferred. Unless
  you specify an F option, if an object of a different type is found and
  none of the preferred type are, the found object will be returned.
 
  (Read "help locate2" for more.)
 
& LOCATE2
 
  You can control where to look with:
    a   -   Absolute match (look for #<object>)
    c   -   Exits carried by <looker>
    e   -   Exits in <looker>'s location
    h   -   "here"  (the location of <looker>)
    i   -   Inventory of <looker>
    l   -   Location (container) of <looker>
    m   -   "me"  (<looker> itself)
    n   -   Neighbors (other objects in same location as <looker>)
    p   -   Player names prefixed by '*'
    z   -   English-style matching (my 2nd book) of <name>
    *   -   All of the above (try a complete match)
 
Just string all the parameters together, without separating them by
spaces, i.e.  LOCATE(#100, Test, Tn)  would check #100's neighbors
for an object named "Test", preferring a thing over other types.
 
& LOCK()
  lock(<object>[/<locktype>][, <new value>])

  lock() returns the text string equivalent of the lock on an object that
  you control. You can also provide a locktype (e.g. "enter", "use", etc.)
  switch after the object, if you want to check something other than the
  regular lock.  If a new value is specified, it will attempt to change
  the lock before reporting it.

  This is a side-effect function and may not be enabled on some MUSHes.
 
  See also: @lock, locktypes
& LOG()
  log(<number>[, <base>])
 
  Returns the logarithm (base 10, or the given base) of <number>.
& LPARENT()
  lparent(<object>)
  
  This function returns a list consisting of the object's db# (as per
  num()), the db# of its parent, grandparent, greatgrandparent, etc.
  The list will not, however, show parents of objects which the player
  is not privileged to examine.
& LPLAYERS()
  lplayers(<object>)

  This function returns the dbrefs of all players, connected or not, in 
  <object>. DARK wizards aren't listed to mortals or those without the
  see_all power. You must be in <object> or control it to use this
  function.

  See also: lvplayers(), lcon()
& LSEARCH()
& SEARCH()
& LSEARCHR()
  lsearch(<player>, <class>, <restriction>[, <low>[, <high>]])
  lsearchr(<player>, <class>, <restriction>[, <low>[, <high>]])
 
  This function is similar to the @search command, except it returns
  just a list of dbref numbers. It is computationally expensive, and
  costs 100 pennies to perform. The function must have at least three
  arguments.  Wizards can specify "all" or <player> for the <player>
  field; mortals must use "me". If you do not want to restrict
  something, use "none" for <class> and/or <restriction>. <low> and
  <high> restrict the search to that range of db#'s and are specified as
  dbrefs ("#2") with the #.

  The possible <class>es and <restriction>s are the same as those accepted
  by @search. See 'help @search' for information about them.
    
  See 'help lsearch2' for more details.
& LSEARCH2
& SEARCH2 
   
  If <class> is one of the eval ones (EVAL, EEXITS, EROOMS, EOBJECTS or
  EPLAYERS), note that any brackets, percent signs, or other special
  characters should be escaped, as the code in <restriction> will be
  evaluated twice - Once as an argument to lsearch(), and then again for
  each object looked at in the search.

  <class> can be 'NONE' to make lsearch() act like a @search without a class.

  lsearchr() is like an lsearch() run through revwords(). Results are returned
  from highest dbref to lowest.
  search() is an alias for lsearch().
 
  Examples:
  
  lsearch(all, flags, Wc)                   <-- lists all connected wizards.
  lsearch(me, type, room)                  <-- lists all rooms owned by me.
  lsearch(me, type, room, 100, 200)        <-- same, but only w/db# 100-200
  lsearch(all, eplayer, \[eq(money(##),100)\]) <-- lists all players with 100
                                                   coins.
& LSTATS()
& STATS()
  lstats(<player>)
  stats(<player>)
 
  This function returns the breakdown of objects in the database, in
  a format similar to "@stats". If <player> is "all", a breakdown is
  done for the entire database. Otherwise, the breakdown is returned
  for that particular player. Only wizards can LSTATS() other players.
  The list returned is in the format:
  <Total objects> <Rooms> <Exits> <Things> <Players> <Garbage>

  stats() is an alias for lstats().
& LT()
  lt(<num>,<num>)

  Takes two numbers, and returns 1 if and only if the first is less
  than the second, and 0 otherwise.
& LTE()
  lte(<num>,<num>)

  Takes two numbers, and returns 1 if and only if the first is less
  than or equal to the second, and 0 otherwise.
& LVCON()
  lvcon(<object>)

  This function returns the dbrefs of all objects that are inside <object>
  and visible (non-dark). You must be in <object> or control it to use this
  function.

  See also: lcon()
& LVEXITS()
  lvexits(<room>)

  This function returns the dbrefs of all visible (non-dark) exits from
  <room>. You must be in the room or control it to use this function.

  See also: lexits()
& LVPLAYERS()
  lvplayers(<object>)

  This function returns the dbrefs of all connected and non-dark players
  in an object. You must be in the object or control it to use this 
  function.
& LWHO()
  lwho()

  This returns a list of the dbref numbers for all currently-connected
  players. When mortals use this function, the dbref numbers of DARK
  wizards or royalty do NOT appear on the dbref list.

  See also: mwho()
& MAIL()
  mail()
  mail(<player name>)
  mail([<folder #>:]<mail message #>)
  mail(<player>, [<folder #>:]<mail message #>)

  Without arguments, mail() returns the number of messages in
  all the player's mail folders. With a player name argument,
  mail() returns the number of read, unread, and cleared messages
  <player> has in all folders. Only Wizards can use this on other players.

  When given numeric arguments, mail() returns the text of the
  corresponding message in the current folder. The message number
  may also be prefaced by the folder number and a colon, to indicate
  a message in a different folder.

  Example: 
  > think mail(3:2)
  (text of the second message in the player's third folder)
  
& MAILFROM()
& MAILTIME()
& MAILSTATUS()
& MAILSUBJECT()
  mailfrom([<player>,] [<folder #>:]<mail message #>)
  mailtime([<player>,] [<folder #>:]<mail message #>)
  mailstatus([<player>,] [<folder #>:]<mail message #>)
  mailsubject([<player>,] [<folder #>:]<mail message #>)
 
  mailfrom() returns the dbref number of the sender of a mail message.
  mailtime() is similar, but returns the time the mail was sent.
  mailsubject() is similar, but returns the subject of the message.
  mailstatus() returns the mail's status characters (as per
  @mail/list)

& MAILSTATS()
& MAILDSTATS()
& MAILFSTATS()
  mailstats([<player>])
  maildstats([<player>])
  mailfstats([<player>])

  mail*stats() functions return data like @mail/*stats does. You
  either must use this on yourself, or you must be a wizard. The
  information will be joined together as a space separated list of
  numbers.

  Example:
  > think mailstats(One)
  <# sent> <# received>
  > think mailfstats(One)
  <# sent> <# sent unread> <# sent cleared> <# sent bytes> <# received>
  <# received unread> <# received cleared> <# received bytes>
& MAP()
  map([<object>/]<attribute>,<list>[,<delim>][, <osep>])
  
  Maps a function onto a list.
 
  This function works much like ITER(). Each element of <list> has
  the user-defined function of the first argument performed on it;
  the element is passed to the function as %0, and its position
  in <list> as %1. <delim> is used as the element delimiter; 
  if it is not specified, a space is used. The resulting output is
  delimited by <osep>, if given, or else by the delimiter
 
  Examples:
  
    > &times_two me=[mul(%0,2)]
 
    > say [map(times_two, 5 4 3 2 1)]
    You say, "10 8 6 4 2"
 
    > say [map(times_two,1;2;3;4;5,;)]
    You say, "2;4;6;8;10"
 
& MATCH()
  match(<list>, <pattern>[, <delimiter>])

  This function tests if the pattern matches an element of the list.
  The pattern can contain the wildcards * and  ?.  ? matches to any
  one character, while * matches to any number of characters
  including none.  So s?x would match to sex or six, but not to socx,
  but s*x would match to all of them. If no match is found, 0 is
  returned. If a match is found, it returns the number of the element
  of the list that matched.  

  This attempts to match to a list element, not to an entire string.
  To match an entire string  (for example, to match "red blue green"
  to "*bl*"), use the strmatch() function.

  See also: element(), grab()
& MATCHALL()
  Function: matchall(<list>,<pattern>[,<delim>[,<osep>]])
 
  This function works identically to the match() function, save that it
  returns all matches, not just the first: It returns the index numbers of
  all elements in the list <string> which match <pattern>. If none match,
  an empty string is returned.  The resulting output is delimited by
  <osep>, if given, or else by the delimiter

  Examples:
 
  > say matchall(This is a test of a test,test)
  You say "4 7"
  > say matchall(This is testing a test,tes*)
  You say "3 5"
 
  See also: match(), strmatch(), graball()
& MAX()
  max(<num1>, <num2>, ..., ...)

  This function returns the largest number in its list of arguments.
  It can take any number of arguments.
& MEAN()
  mean(<number>,...)

  Returns the mean (Average) of its arguments.
& MEDIAN()
  median(<number>,...)

  Returns the median (the middlemost numerically) of its arguments.
& MEMBER()
  member(<list>,<word>[,<delimiter>])

  Takes a list and a word, and returns the position of <word>
  if <word> is a word in <list>.  A word is defined as a string which
  has no interior spaces.  So '  hello  ' would be one word, while
  'hello there' would be two.  See LISTS

  member() is case-sensitive.
& MERGE()
  merge(<string1>, <string2>, <character>)
  
  This function merges <string1> and <string2>, depending on <character>.
  If a character in <string1> is the same as <character>, it is replaced
  by the character in the corresponding position in <string2>.  The two
  strings must be of the same length.
  
  Example:
    > say [merge(AB--EF,abcdef,-)]
    You say, "ABcdEF"
 
  Spaces need to be treated specially. A null character is considered to
  equal a space, for <character>.
  
  Example:
    > say [merge(AB[space(2)]EF,abcdef,)]
    You say, "ABcdEF"
  
& MID()
  mid(<string>, <first>, <length>)

  Mid returns a segment of the string, the <length> characters to the
  right of the <first> character.  Note that the first character in a
  string is numbered zero, and not one.
& MIN()
  min(<num1>, <num2>, ..., ...)

  This function returns the smallest number in its list of arguments.
  It can take any number of arguments.
& MIX()
 
  mix([<object>/]<attribute>,<list 1>,<list 2>[,...,<list n>],[<delim>])
 
  This function is similar to MAP(), except that it takes the elements
  of two or more lists, one by one, and passes them to the user-defined
  function as %0, %1, up to %9, respectively, for elements of <list 1> to
  <list 10>. If the lists are of different sizes, the shorter ones are padded
  with empty elements. <delim> is used to separate elements; if it is not
  specified, it defaults to a space. If using more than 2 lists, the last
  argument must be a delimiter.

  See HELP MIX2 for examples
& MIX2  
  Examples of mix():
 
  > &add_nums me=[add(%0, %1)]
  > say [mix(add_nums,1 2 3 4 5, 2 4 6 8 10)]
  You say, "3 6 9 12 15"
  > &lengths me=[strlen(%0)] and [strlen(%1)].
  > say [mix(lengths, some random, words)]
  You say, "4 and 5. 6 and 0."
  > &add_nums me=[add(%0, %1, %2)]
  > say [mix(add_nums, 1:1:1, 2:2:2, 3:3:3, :)]
  You say, "6:6:6"
 
& MOD()
& MODULO()
& MODULUS()
& REMAINDER()
  mod(<number>,<number>)
  modulo(<number>,<number>)
  modulus(<number>,<number>)
  remainder(<number>,<number>)

  Remainder returns the remainder of the integer division of the first
  number by the second.  Modulo returns the modulo of the two numbers.
  For positive numbers, these are the same, but they may be different
  for negative numbers:

     modulo(13,4)       ==>  1      and     remainder(13,4)    ==>  1
     modulo(-13,4)      ==>  3      but     remainder(-13,4)   ==>  -1
     modulo(13,-4)      ==>  -3     but     remainder(13,-4)   ==>  1
     modulo(-13,-4)     ==>  -1     and     remainder(-13,-4)  ==>  -1 
 
  Remainder result always has the same sign as the first argument. 
  Modulo result always has the same sign as the second argument.

  Mod and modulus are just aliases for modulo.

  See also: DIV
& MONEY()
  money(<object>)
  money(<integer>)

  The first form returns the amount of money <object> has.
  The second form returns the name for a given amount
  of money, appropriately inflected as singular or plural.

  > say [money(Javelin)]
  You say, "150"
 
  > say [money(1)]
  You say, "Penny"

  > say [money(2)]
  You say, "Pennies"

  > &counter me=$count *: @emit %0 [money(%0)]
  > count 2
  2 Pennies

& MTIME()
  mtime(<object>)

  If creation times are enabled, this function will return the 
  date and time that one of the object's attributes was last
  added, deleted, or modified. Only things, rooms, and exits have
  modification times.
 
& MUDNAME()
  Function: mudname()
 
  Returns the name of the MUD.  This is usually (but not necessarily) the name
  that appears in the various mud lists, and is the name that the mud is
  listed under in reports from any inter-mush bots like mudnet that it's
  connected to.
  Example:
    > say mudname()
    You say "TestMUSH"

& MUL()
  mul(<number>,<number>,...)

  Returns the product of some numbers.
& MUNGE()
  munge([<object>/]<attribute>,<list 1>,<list 2>[,<delimiter>[,<osep>]])
 
  This function takes two lists of equal length. It passes the entirety of
  <list 1> to the user-defined function as %0, and the delimiter as %1.
  Then, this resulting list is matched with elements in <list 2>, and
  the rearranged <list 2> is returned. This is useful for doing things
  like sorting a list, and then returning the corresponding elements in
  the other list. If a resulting element from the user-defined function
  doesn't match an element in the original <list 1>, a corresponding
  element from <list 2> does not appear in the final result.

  See HELP MUNGE2 for examples.
& MUNGE2
  For example: Consider attribute PLACES, which contains "Fort Benden Ista",
  and another attribute DBREFS contains the dbrefs of the main JUMP_OK
  location of these areas, "#20 #9000 #5000".  We want to return a list of
  dbrefs, corresponding to the names of the places sorted alphabetically. The
  places sorted this way would be "Benden Fort Ista", so we want the final
  list to be "#9000 #20 #5000". The functions, using munge(), are simple:
  
  > &sort me=[sort(%0)]
  > say [munge(sort,v(places),v(dbrefs))]
  You say, "#9000 #20 #5000"
 
  See HELP MUNGE3 for another example
& MUNGE3
  Another common task that munge() is well suited for is sorting a list
  of dbrefs of players by order of connection. This example reuses the 
  &sort attribute from the previous one, but unlike the other example,
  it builds the list to sort on out of the list to return. 
  
  > &faction_members me=#3 #12 #234
  > say [munge(sort,iter(v(faction_members),conn(##)),v(faction_members))]
  You say, "#12 #234 #3"
& MWHO()
  mwho()

  This returns a list of the dbref numbers for all current-connected,
  non-hidden players. It's exactly the same as lwho() used by a
  mortal, and is suitable for use on privileged global objects who
  need an unprivileged who-list.
& NAME()
  name(<object>[,<new name>])
  name(<player>[,<new name> <password>])
 
  Name returns the name of object <object>. For exits, name returns
  the displayed name of the exit.
 
  If function side effects are allowed, this function, given two arguments,
  acts just like @name <object>=<new name>. Consequently, if renaming
  a player, you must use the player's password or be God.

  Related functions: FULLNAME(), INAME() 
& NAND()
  nand(<boolean>, <boolean>,...)

  Returns 1 if at least one of its arguments is false, 0 if all are
  true. Equivalent to not(and()), but more efficient.
& NEARBY()
  nearby(<object 1>, <object 2>)

  Returns 1 if object 1 is "nearby" object 2. "Nearby" is defined as:
  object 1 is in the same location as object 2, or,
  object 1 is being carried by object 2, or,
  object 1 is carrying object 2.
  You must control at least one of the objects.
& NEQ()
  [neq(<integer1>,<integer2>)]

  Basically the same as [not(eq(<integer1>,<integer2>))].

  See also: eq(), not()
& NEXT()
  next(<object>)

  If object is an exit in a room, then next() will return the next 
  non exit in the list of exits for that room.  If object is a
  thing or a player, then next will return the next object in the
  contents list that the object is in.  Otherwise, it returns a
  '#-1' string.  '#-1' is also used to denote that there are no
  more exits/things/players in the container.

  You can get the complete contents of any container you may examine,
  regardless of whether or not objects are dark.  You can get the
  partial contents (obeying DARK/LIGHT/etc.) of your current location
  or the enactor (%#).  You CANNOT get the contents of anything else,
  regardless of whether or not you have objects in it.  These rules
  apply to exits, as well.

  See also: lcon(), lexits(), con(), exit()
& NOR()
  nor(<boolean>, <boolean>,...)

  Returns 1 if all its arguments are false, 0 if one is true.
  Equivalent to not(or()), but more efficient.

  See also: and(), or(), xor(), not()
& NOT()
  [not(<boolean value>)]

  Takes a boolean value, and returns its inverse.  
  I.E. if the input is equivalent to true(1), it returns a 0, and if 
  the input is equivalent to false(0), it returns a 1.

  The definition of truth and falsehood depends on configuration settings;
  see help BOOLEAN VALUES for details.
 
  See also: and(), or(), nor(), xor()
& NSPEMIT()
  nspemit(<object list>,<message>)

  This wizard-only function will send each object on the list a
  message, as per the @nspemit/list command. It returns nothing. It is
  similar to pemit(), except it does not include any nospoof information.
  Like @nspemit, it is meant for use with globals where nospoof
  information isn't wanted.
  
  See also: pemit(), @nspemit
& NUM()
  num(<object>)

  Returns the dbref number of the object, which must be in the same 
  room as the object executing num.
& OBJ()
  obj(<object>)

  Returns the objective pronoun - him/her/it - for an object.
& OBJEVAL()
  objeval(<object>, <expression>)
 
  Allows you to evaluate <expression> from the viewpoint of <object>.
  If side-effect functions are enabled, you must control <object>;
  if not, you must either control <object> or have the see_all power.
  If <object> does not exist or you don't meet one
  of the criterion, the function evaluates with your privileges.
 
  This function is useful for securing objects which need to evaluate
  attributes on things owned by others.
  
& OBJMEM()
  objmem(<object>)

  This function returns the amount of memory, in bytes, being used
  by the object. It can only be used by players with Search powers.

  See also: playermem()

& OEMIT()
  oemit([<room>/]<object> [<object> ...],<message>)

  Sends <message> to all objects in <room> (default is the location 
  of <object>(s)) except <object>(s), as per @oemit.

& OPEN()
  open(<exit name>, <room>)
 
  This function opens an exit called <exit name> and links it to
  <room>, which must be a dbref number. It returns the dbref number
  of the new exit.
 
& OR()
& COR()
  or(<boolean value 1>,<boolean value 2>[, ... , <boolean value N>])
  cor(<boolean value 1>,<boolean value 2>[, ... , <boolean value N>])
 
  Takes boolean values, and returns a 1 if at least one of the inputs 
  is equivalent to true(1).  or() always evaluates all arguments
  (including side effects), while cor() stops evaluation after the
  first argument that evaluates to true.

  See also: BOOLEAN VALUES, and()
& ORFLAGS()
  orflags(<object>,<list of flags>)
  
  This function returns 1 if <object> has at least one of the flags in
  a specified list, and 0 if it does not. The list is specified with a
  single letter standing for each flag, like the output of the FLAGS()
  function. A '!' preceding a flag letter means "not flag".
  
  Thus, ORFLAGS(me,Wr) would return 1 if I am set WIZARD or ROYALTY.
  ORFLAGS(me,D!c) would return 1 if I am DARK or not CONNECTED.
  
  If a letter does not correspond to any flag, <object> doesn't have
  it, so it is simply ignored. There can be an arbitrary number of
  flags. Do not put spaces between flag letters.
& OWNER()
  owner(<object>[/<attribute>])
 
  Given just an object, it returns the owner of the object.
  Given an object/attribute pair, it returns the owner of that attribute.
& PARENT()
  parent(<object>[, <new parent>])
 
  This function returns the dbref number of an object's parent. You
  must be able to examine the object to do this. 
  If you specify a second argument, it tries to re-parent the object.
  In this case, you must control the object.
& PEMIT()
  pemit(<object list>,<message>)

  This function will send each object on the list a message, as per
  the @pemit/list command. It returns nothing. It respects page-locks and
  HAVEN flags on players.
& PI()
  pi()
  
  Returns the value of "pi" (3.14159265358979323846264338327, rounded
  to the game's float_precision setting).
& PLAYERMEM()
  playermem(<player>)

  This function returns the amount of memory, in bytes, being used
  by everything owned by the player. It can only be used by players
  with Search powers.

  See also: objmem()

& PMATCH()
  pmatch(<string>)
 
  Given the partial name of a player, it returns that player's dbref
  number. This partial name completion works similarly to the partial
  name completion of the "page" command - i.e. it first attempts to match
  the normal names of all players (connected or not), and if that fails,
  it tries to match the partial names of connected players visible to
  the enactor. If no player is matched, it returns "#-1". If more than
  one match is possible for a partial name, it returns "#-2".

  Pmatch() will also accept *<player> or #<db#>. If given a non-player
  dbref #, pmatch() will return #-1.
& POLL()
  poll()

  This function returns the current @poll. 

  See also: @poll, doing(), @doing 
& PORTS()
  ports(<player name>)
 
  This function returns the list of descriptors ("ports") that a player,
  specified by full player name, or by dbref, is connected to. Only Wizards
  and Royalty may use this function; if a user lacks the privileges, or the
  player is not connected, an empty list is returned. Otherwise, a list of
  ports is returned in order of most recent connection to least recent
  connection.
& POS()
  pos(<string1>,<string2>)

  This function returns the position that string1 begins in string2,
  with the first position being 1.  
  If string1 is not in string2, then it returns #-1.
  
& POSS()
  poss(<object>)

  Returns the possessive pronoun - his/her/its - for an object.
& POWER()
  power(<number>,<exponent>)
 
  Returns <number> to the power of <exponent>.
& POWERS()
  powers(<object>)

  Returns a space-separate list of powers possessed by the object.
  If the object does not exist, #-1 will be returned.
& QUOTA()
  quota(<player>)  
  
  Returns the player's quota, the maximum number of objects they can
  create, if quotas are in effect. Returns 99999 for players with
  unlimited quotas, so it's safe to use in numerical comparisons.
& R()
& R-FUNCTION
  r(<register>)
  
  The r() function is used to access "local registers", and returns
  the contents of the specified register. There are 36 such registers,
  numbered 0 through 9, and A through Z.
 
  The '%qN' percent-substitution can also be used to access these local
  registers, where N is register <register> needed.
  
  See "help SETQ()" for details about registers.
& RAND()
  rand(<num>)

  Rand returns an integer between 0 and num-1.
  If called with an invalid argument, rand() returns an error message
  beginning with #-1.
& REGEDIT()
& REGEDITALL()
& REGEDITI()
& REGEDITALLI()
  regedit(<string>, <regexp>, <replacement>[, <regexp2>, <replace2> ...])
  regediti(<string>, <regexp>, <replacement>[, <regexp2>, <replace2> ...])
  regeditall(<string>, <regexp>, <replacement>[, <regexp2>, <replace2> ...])
  regeditalli(<string>, <regexp>, <replacement>[, <regexp2>, <replace2> ...])

  These functions are a version of edit() that uses regular expressions.
  The part of <string> that matches the <regexp> is replaced by the
  evaluated <replacement>, with $<number> in <replacement> expanded to the
  corresponding matching sub-expression of <regexp>, with $0 the entire
  matched section. regedit() only replaces the first match.
  regeditall() replaces all matches. The versions ending in i are
  case insensitive. The <replacement> argument is evaluated once for
  each match, allowing for more complex transformations than is
  possible with straight replacement.

  Example:
  > say regedit(this test is the best string, (.)est, $1rash)
  You say "this trash is the best string"
  > say regeditall(this test is the best string, (.)est, [capstr($1)]rash)
  You say "this Trash is the Brash string"

  See also: edit(), regmatch()
& REGMATCH()
  (Help text from TinyMUSH 2.2.4, with permission)
  regmatch(<string>,<regexp>[,<register list>])
  regmatchi(<string>,<regexp>[,<register list>])
 
  This function matches the regular expression <regexp> against the
  entirety of <string>, returning 1 if it matches and 0 if it does not.
  regmatchi() does the same thing, but case-insensitively.
 
  If <register list> is specified, there is a side-effect: any
  parenthesized substrings within the regular expression will be set
  into the specified local registers, in the order they were specified
  in the list. <register list> can be a list of one through nine numbers.
  If the specified register is -1, the substring is not copied into a
  register. Under regmatchi, case of the substring may be modified.
 
  For example, if <string> is 'cookies=30', and <regexp> is '(.+)=([0-9]*)'
  (parsed; note that escaping may be necessary), then the 0th substring
  matched is 'cookies=30', the 1st substring is 'cookies', and the 2nd
  substring is '30'. If <register list> is '0 3 5', then %q0 will become
  "cookies=30", %q3 will become "cookies", and %q5 will become "30".
  If <register list> was '0 -1 5', then the "cookies" substring would
  simply be discarded.
 
  See 'help regexp syntax' for an explanation of regular expressions.

  See also: regrab()
& REMIT()
  remit(<object>, <message>)

  Sends a message to the contents of <object>, as per @remit.

& REMOVE()
  remove(<list>,<word>[,<delimiter>])

  Remove takes a list and a word, and returns the list, with the
  first occurrence of the word deleted from it.  

  A word is defined as a string which contains no interior spaces (or
  <delimiter>'s if <delimiter> is used).  If the word is not in the
  list, then the list is returned.

  To remove all occurrences of a word from a string, consider
  using edit().

& REPEAT()
  repeat(<string>,<number>)
  
  This function simply repeats <string>, <number> times.  No spaces are
  inserted between each repetition.
  
  Example:
    > say [repeat(Test, 5)]
    You say, "TestTestTestTestTest"
  
& REPLACE()
  replace(<list>,<position>,<new item>[,<single-character separator>])
  
  This replaces the item at <position> of <list> with <new item>.
  If no separator is given, a space is assumed.
  
  Examples:
    > say [replace(Turn north at the junction,2,south)]
    You say, "Turn south at the junction"
    > say [replace(blue|red|green|yellow,3,white,|)]
    You say, "blue|red|white|yellow"
  
& REST()
  rest(<string>[,<delimiter>])

  Rest takes a string, returns all the string except the first word, 
  that is, everything to the right of the first space, or an empty 
  string, or the empty string if there are no spaces in the string.  
  See FIRST, LAST.
& REVWORDS()
  revwords(<list of words>[,<delimiter>][, <output seperator>])
 
  This function reverses the order of words in a list.
 
  Example:
    > say revwords(foo bar baz eep)
    You say, "eep baz bar foo"
  
& RIGHT()
  right(<string>, <length>)

  Returns the <length> rightmost characters from string.

& RJUST()
  rjust(<string>,<length>[,<fill>])
  
  This function pads a string with leading characters ("right-justifies")
  so it is <length> long. If <string> is longer than <length>, the <string>
  is returned; it is not truncated. If <fill> is not specified, a space
  is used.
 
  Examples:
  
    > say -[rjust(foo,6)]-
    You say, "-   foo-"
  
    > say %r0[rjust(foo,6,-)]%r01234567
    You say, "
    0---foo7
    01234567"
 
& RLOC()
  rloc(<object>, <levels>) 
  
  This function may be used to the get the location of an object's location
  (and on through the levels of locations), substituting for repeated nested
  loc() calls. <levels> indicates the number of loc()-equivalent calls to
  make; i.e., loc(loc(<object>)) is equivalent to rloc(<object>,2).
  rloc(<object>,0) is equivalent to num(<object>), and rloc(<object>,1) is
  equivalent to loc(<object>).
  
  If rloc() encounters a room, the dbref of that room is returned. If rloc()
  encounters an exit, the dbref of that exit's destination is returned.
  It can also return the locations of controlled or nearby objects, or of
  findable players.
 
  Related functions:  LOC(), WHERE(), ROOM()
 
& RNUM()
  rnum(<room number>, <object>)
 
  This function returns the dbref number of an object (player, thing, or
  exit). The object must be in the specified room. This function is
  essentially identical to NUM(), except it matches things in the
  specified room rather than the room that you are in. The RNUM()
  function is meant to be used in conjunction with Master Room objects.

& ROOM()
  room(<object>)

  Returns the "absolute" location of an object. This is always a room;
  it is the container of all other containers of the object. The
  "absolute" location of an object is the place @lemit messages are
  sent to and NO_TEL status determined.
  You must control the object, be a wizard or royalty, or be near
  the object in order for this function to work. The exception to this
  are players; if <object> is a player, the ROOM() function may be
  used to find the player's absolute location if the player is not
  set UNFINDABLE.
& ROUND()
  round(<number>,<places>)
 
  Rounds <number> to <places> decimal places. <places> must be between
  0 and 6.
 
& S()
& S-FUNCTION
  s(string)

  This function performs evaluation on a string and returns that
  string.  It should be considered extremely dangerous to use on a
  string that you don't have complete control over (i.e., on user
  input).  As usual, %n is the name, %s the subjective pronoun, %o the
  objective, and %p the possessive.  Functions are evaluated.
  It is important to note that the pronoun is that of the triggering object.

  So, if the ve of an object were: "[s(This is %n)], and I were to 
  type @trigger <object>/ve, it would return "This is <myname>", but 
  if vf were @trigger me/ve, then triggering the vf makes the ve 
  return "This is <object>"
    
& SCRAMBLE()
  scramble(<string>)
  
  This function scrambles a string, returning a random permutation of its 
  characters. For example, "[scramble(abcdef)]" might return "cfaedb".
  Note that this function does not pay any attention to spaces or other
  special characters; it will scramble these characters just like normal
  characters.
  
& SECS()
  secs()
 
  This function takes no arguments, and returns the number of elapsed
  seconds since midnight, January 1, 1970 UTC. UTC is the base time zone,
  formerly GMT. This is a good way of synchronizing things that must
  run at a certain time.
& SECURE()
  secure(<string>)
 
  This function returns <string> with all "dangerous" characters replaced
  by spaces. Dangerous characters are ( ) [ ] { } $ % , ^ and ;
  This can make output slightly ugly, but it's a good way of preventing
  other people from doing nasty things with your objects.

  See also: ESCAPE()

& SET()
  set(<object>, <flag>)
  set(<object>/<attribute>, <attribute flag>)
  set(<object>, <attribute>:<value>)
 
  This function is equivalent to @set, and can be used to switch
  flags, set attributes, and many other things.  The two arguments
  to the function are the same as the arguments that would appear
  on either side of the '=' in @set. This function returns nothing.
 
  Note that you can't clear an attribute with set(), though
  you can make it an empty attribute. Use wipe() to clear attributes.

& SETDIFF()
  setdiff(<list1>, <list2>[, <delimiter>][, <sort type>][, <osep>])
 
  This function returns the difference of two sets -- i.e., the
  elements in <list1> that aren't in <list2>. The list that is
  returned is sorted. Normally, alphabetic sorting is done. You can
  change this with the fourth argument, which takes the same form as
  sort()'s second. If used with exactly four arguments where the fourth
  is not a sort type, it's treated instead as the output separator.

  Example:
    > say setdiff(foo baz gleep bar, bar moof gleep)
    You say, "baz foo"
 
& SETINTER()
  setinter(<list1>, <list2>[, <delimiter>][, <sort type>][,<osep>])
 
  This function returns the intersection of two sets -- i.e., the
  elements that are in both <list1> and <list2>. The list that is
  returned is sorted. Normally, alphabetic sorting is done. You can
  change this with the fourth argument, which takes the same form as
  sort()'s second. If used with exactly four arguments where the fourth
  is not a sort type, it's treated instead as the output separator.
 
  Example:
    > say setinter(foo baz gleep bar, bar moof gleep)
   You say, "bar gleep"

& SETQ()
& SETR()
  setq(<register>,<string>)
  setr(<register>,<string>)
  
  The setq() and setr() functions are used to copy strings into local
  registers.  setq() returns a null string; it is a purely "side effect"
  function.  setr() returns the value stored.
  
  There are thirty-six local registers, numbered 0 through 9 and A through Z.
  They are cleared at the start of each new queue cycle (i.e. whenever
  a new command is evaluated). They are most useful for storing
  complex function evaluations which are used repeatedly within a
  single command.
 
  Registers set via setq() or setr() can be accessed via the r() function, 
  or via the %qN percent-substitution.
  
  See "help SETQ2" for examples of its use.
  
& SETQ2
  
  The setq() function is probably best used at the start of the string
  being manipulated, such as in the following example:
  
    &TEST object=[strlen(%0)]
    &CMD object=$test *:"[setq(0,u(TEST,%0))]Test. %0 has length [r(0)].
    test Foo
    > Object says, "Test. Foo has length 3."
  
  In this case, it is a waste to use setq(), since we only use the function
  result once, but if TEST was a complex function being used multiple times
  within the same command, it would be much more efficient to use the local
  register, since TEST would then only be evaluated once.
  
  setq() can thus be used to improve the readability of MUSH code, as well
  as to cut down the amount of time needed to do complex evaluations.
 
  See "help SETQ3" for scoping rules of setq().
  
& SETQ3
  The registers set by setq() can be used in later commands in the same
  thread.  That is, the registers are set to null on all $-commands,
  ^-commands, A-attribute triggers, etc., but are then retained from
  that point forward through the execution of all your code.  Code
  branches like @wait and @switch retain the register values from the
  time of the branch, so the code:
    
  say setr(a,foo); @wait 0=say %qa; say setr(a,bar)
    
  produces the following when executed by an object:
  
  Object says "foo"
  Object says "bar"
  Object says "foo"

& SETUNION()
  setunion(<list1>, <list2>[, <delimiter>][, <sort type>][, <osep>])
 
  This function returns the union of two sets -- i.e., all the
  elements of both <list1> and <list2>, minus any duplicate
  elements. Think of it as CAT() without words duplicated.  The list
  returned is sorted. Normally, alphabetic sorting is done. You can
  change this with the fourth argument, which takes the same form as
  sort()'s second. If used with exactly four arguments where the fourth
  is not a sort type, it's treated instead as the output separator.
 
  Example:
    > say setunion(foo baz gleep bar, bar moof gleep)
    You say, "bar baz foo gleep moof"
    > say setunion(1.1 1.0, 1.000)
    You say, "1.0 1.000 1.1"
    > say setunion(1.1 1.0, 1.000, %b, f)
    You say, "1.0 1.1"
& SHA1()
  sha1(<string>)

  Returns the SHA-1 cryptographic hash of the string. See RFC 3174
  for more information.
& SHL()
  shl(<number>,<count>)

  Performs a leftwards bit-shift on <number>, shifting it <count> times.
  This is equivalent to mul(<number>,power(2,<count>), but much faster.
& SHR()
  shr(<number>,<count>)

  Performs a rightwards bit-shift on <number>, shifting it <count> times.
  This is equivalent to div(<number>,power(2,<count>), but much faster.
& SHUFFLE()
  shuffle(<word1> <word2> <word3> <...wordN>[,<delimiter>][,<osep>])
  
  This function shuffles the order of words in a list, returning a
  random permutation of its elements. "[shuffle(foo bar baz gleep)]" 
  might evaluate to "baz foo gleep bar".
  
& SIGN()
  sign(<number>)

  Essentially returns the sign of a number -- 0 if the number is 0,
  1 if the number is positive, and -1 if the number is negative.
  Thus, SIGN(-4) is -1, SIGN(2) is 1, and SIGN(0) is 0.
& SIN()
  sin(<angle>[, <angle type>)  
 
  Returns the sine of <angle>, which should be expressed in the
  given angle type, or radians by default.

  See HELP CTU() for more on the angle type.
& SORT()
  sort(<word1> <word2> ...[,<sort type>][,<delimiter>][,<output sep>])
  
  This sorts a list of words. If no second argument is given, it will
  try to detect the type of sort it should do. If all the words are
  numbers, it will sort them in order of smallest to largest. If all
  the words are dbrefs, it will sort them in order of smallest to
  largest. Otherwise, it will perform a lexicographic sort.
  
  The following letters as a second argument specify a certain sort:
 
  'a':  Sort lexicographically.
  'd':  Sort dbrefs.
  'n':  Sort integer numbers.
  'f':  Sort decimal numbers.
  
  The optional third argument gives the list's delimiter character.
  If not present, <delimiter> defaults to a space.
  The optional fourth argument gives a string that will delimit
  the resulting list; it defaults to <delimiter>. 

& SORTBY()
  sortby([<obj>/]<attrib>,<list>[,<delimiter>][, <output seperator>])
 
  This sorts an arbitrary list according to the u-function <obj>/<attrib>.
  This u-function should compare two arbitrary elements, %0 and %1, and
  return zero (equal), a negative integer (element 1 is less than element 2)
  or a positive integer (element 1 is greater than element 2).
 
  A simple example, which imitates a normal alphabetic sort:
    > &ALPHASORT test=[comp(%0,%1)]
    > say [sortby(test/ALPHASORT,foo bar baz)]
    You say, "bar baz foo"
 
  A slightly more complicated sort. #1 is "God", #2 is "Amby", "#3" is "Bob":
    > &NAMESORT me=[comp(name(%0),name(%1))]
    > say [sortby(NAMESORT,#1 #2 #3)]
    You say, "#2 #3 #1"
 
  Warning: the function invocation limit applies to this function. If
  this limit is exceeded, the function will fail _silently_. List and
  function sizes should be kept reasonable.
& SOUNDEX()
  soundex(<word>)

  The soundex function returns the soundex pattern for a word.
  A soundex pattern represents the sound of the word, and similar
  sounding words should have the same soundex pattern. Soundex patterns
  consist of an uppercase letter and 3 digits.
 
  > think soundex(foobar)
  F160

  For details of how the algorithm works, see help soundex2

  See also: soundslike()
& SOUNDEX2
  Here's how the soundex algorithm works:
  1. The first letter of the soundex code is the first letter of
     the word (exception: words starting with PH get a soundex
     starting with F)
  2. Each remaining letter is converted to a number:
      vowels, h, w, y ---------> 0
      b, p, f, v --------------> 1
      c, g, j, k, q, s, x, z --> 2
      d, t --------------------> 3
      l -----------------------> 4
      m, n --------------------> 5
      r -----------------------> 6
     At this stage, "foobar" is "F00106" 
  3. Strings of the same number are condensed. "F0106"
  4. All 0's are removed, because vowels are much less important
     than consonants in distinguishing words. "F16"
  5. The string is padded with 0's or truncated to 4 characters. "F160"
  That's it. It's not foolproof (enough = "E520", enuf = "E510") but
  it works pretty well. :)
& SOUNDLIKE()
& SOUNDSLIKE()
  soundslike(<word>,<word>)
  soundlike(<word>,<word>)

  The soundslike function returns 1 if the two words have the same
  soundex code (see help soundex() for information), which means, 
  in general, if they sound alike. For example:
  
  > think soundslike(robin,robbyn)
  1
  > think soundslike(robin,roebuck)
  0

& SPACE()
  space(<number>)
 
  Prints <number> number of spaces. Useful for times when you want to
  be able to use lots of spaces to separate things. For example,
  "a[space(5)]b  would print, "Amberyl says, "a     b"".
& SPELLNUM()
  spellnum(<number>)

  Given a number, return its written-out representation in words.
& SPLICE()
  splice(<list1>, <list2>, <word>[, <delimiter>])
  
  This function splices <list1> and <list2> together. <list1> and <list2>
  are space-separated lists of words
  
  If a word in <list1> is the same as <word>, it is replaced by the word
  in the corresponding position in <list2>.  Both lists must have the
  same number of words.
  
  Example:
    > say [splice(foo bar baz,eek moof gleep,bar)]
    You say, "foo moof baz"
  
& SQRT()
  sqrt(<number>)
 
  Returns the square root of <number>. <number> cannot be negative.
& SQUISH()
  squish(<string>[, <character>])
  
  This function removes the leading and trailing <character>s from a string,
  and condenses all inter-word <character>s to a single <character>. If no
  character is given, uses space.
  
  Example:
  
    > say [squish(  foo bar  baz blech   eek )]
    You say, "foo bar baz blech eek"
    > say [squish(||a|| b|c|d, |)]
    You say, a| b|c|d

& STARTTIME()
  Function: starttime()
 
  Returns a string which is the time the MUSH first started up.  The time
  is in the same format as the TIME() function returns.
 
  Example:
    > say starttime()
    You say "Sat Dec  7 00:09:13 1991

  See also: convtime(), restarttime(), restarts()
& RESTARTTIME()
  restarttime()

  Returns a string which is the time the MUSH last rebooted. The time
  is in the same format as the TIME() function returns.

  See also: convtime(), starttime()
& RESTARTS()
  restarts()

  Returns the number of times the server has been rebooted with
  @shutdown/reboot since the last full startup.
& STEP()
  step([<obj>/]<attr>, <list>, <step>[, <delim>, <outsep>])

  This function is similar to map(), except you can pass up to
  10 elements of the list at a time, in %0 to %9. <step> must
  be between 1 and 10, with a step of 1 equivalent to map().
  If the elements of the list can't be split up evenly, the last
  evaluation pads the missing values with empty values. 
  If no output separator is given, the delimiter (Default is a
  space) is used.

  Continued in step2
& STEP2
  Example:
  > &foo me=%0 - %1 - %2%r
  > think step(foo, 1 2 3 4 5, 3)
  1 - 2 - 3
  4 - 5 -

  See also: map(), iter()
& STDDEV()
  stddev(<number>,...)

  Returns the sample standard deviation of its arguments.
& STRCAT()
  strcat(<string1>, <string2>)
 
  Concatenates two strings together, with no space between them.
  For example, strcat(foo bar,baz blech) will return the string
  "foo barbaz blech".
& STRINSERT()
  strinsert(<string>, <position>, <insert>)

  This function returns <string>, with <insert> added before <position>
  in <string>. Note that the first character in a string is numbered 0,
  not 1. 

  Example:
  > think strinsert(barbaz, 0, foo)
  foobarbaz
  > think strinsert(Myname, 2, %b)
  My name   
& STRIPACCENTS()
  stripaccents(<string>)

  Returns the string with accented characters converted to non-accented.
  As with the accent() function, this assumes the ISO 8859-1 character set.
& STRIPANSI()
  stripansi(<string>)

  Returns the string with all ansi and HTML codes removed.
& STRLEN()
  strlen(<string>)

  Returns the length of the string in a numerical string.
& STRMATCH()
  strmatch(<string>, <pattern>)
  
  This function is matches <pattern> against the entire <string>.
  It returns 1 if it matches and 0 if it doesn't. It is not
  case-sensitive, and <pattern> may contain wildcards.
 
  strmatch(Foo bar baz,*Baz) will return 1.
  strmatch(Foo bar baz,*Foo) will return 0.
  strmatch(Foo bar baz,*o*a*) will return 1.
  
& SUB()
  sub(<num>, <num>)
 
  Sub() subtracts the second number from the first.
& SUBJ()
  subj(<object>)

  Returns the subjective pronoun - he/she/it - for an object.
& SWITCH()
& SWITCHALL()
& CASE()
& CASEALL()
  switch(<string>, <expr1>, <list1>, [<exprN>, <listN>], ...[<default>])
  switchall(<string>, <expr1>, <list1>, [<exprN>, <listN>], ...[<default>])
  case(<string>, <expr1>, <list1>, [<exprN>, <listN>], ...[<default>])
  caseall(<string>, <expr1>, <list1>, [<exprN>, <listN>], ...[<default>])

  These functions match <string> against the <expr>essions, returning the
  corresponding <list>. If nothing is matched, the <default> is returned.
  Only the first matching expression counts (like @switch/first), and
  <list>s that are not returned are not evaluated.

  Wildcard patterns are allowed in switch() and switchall(). case() and
  caseall() do a case-sensitive exact match, like member() or comp().

  If the string "#$" appears in the <list> to be evaluated, it will be
  replaced with the evaluated value of <string> /before/ evaluation of
  <list>. This is not done in case() and caseall(), for TinyMUSH 3
  compatibility.
 
  switchall() and caseall() will return all the <lists> with matching
  <expr>ssions, without spaces between them, so they match similarly to
  @switch, while switch() and case() match more like @switch/first.

  See HELP SWITCH WILDCARDS for more, and HELP SWITCH2 for examples
& SWITCH2
  Examples of switch() and related functions:
    > say switch(test, *a*, foo, *b*, bar, *t*, neat, baz)
    You say, "neat"
    > say switchall(ack, *a*, foo, *b*, bar, *c*, neat, baz)
    You say, "fooneat"
    > say switch(moof, *a*, foo, *b*, bar, *t*, neat, baz)
    You say, "baz"
    > say switch(moof, *a*, foo, *b*, bar, *t*, neat, #$)
    You say, "moof"
    > say case(moof, *f, foo, moof, bar, baz)
    You say, "bar"
& SWITCH WILDCARDS
  @switch, @select, switch() and switchall() normally do wildcard
  matching between their first argument and the <expr>ession
  arguments, with the normal * and ? special characters. However, if
  one of the <expr>essions starts with < or >, a less than or greater
  than check is done instead of wildcard matching for that pair.

  switch(X, >Y, A, B) returns A if X is greater than Y,
  and B if X is less than or equal to Y.
  
  switch(X, <Y, A, B) returns A if X is less than Y,
  and B if X is greater than or equal to Y.

  If X and Y are numbers, the test is like using gt() or lt(). gte()
  and lte() can be simulated by using Y'=Y-1 and Y'=Y+1.

  If X and Y are non-numeric strings, the result of comp(X,Y) is used
  to determine which string is alphabetically before (Less than) the other.

  If you need to have a leading < or > that's treated like a normal
  character in a wildcard match, use \\< or \\> (The \\ will turn into
  \ when the argument is evaluated, and then that single \ will stop
  the greater/less than check).

  See also: HELP WILDCARDS
& T()
  t(<expression>)

  Returns a 0 if the expression is false, and 1 otherwise. 
  The definition of truth and falsehood depends on configuration settings;
  see help BOOLEAN VALUES for details.

& TABLE()
  table(<list>,<field width>,<line length>,<delimiter>,<output separator>) 

  This function returns the elements of <list> in a tabular format.
  All other parameters are optional.
  <field width> specifies how wide each table entry is allowed to be.
  It defaults to 10 characters
  <line length> is how wide a table row can be. Default is 78 chars.
  <delimiter> is the delimiter used in <list>. Default is white space.
  <output separator> is a single character to be used between entries
  in the table. Default is a single space.
 
  Examples:
  > think table(a b areallylongone d)
  a          b          areallylon d

  > think table(the quick brown fox,10,25, ,|)
  the       |quick
  brown     |fox
    
& TAN()
  tan(<angle>[, <angle type>])
 
  Returns the tangent of <angle>, which should be expressed in the
  given angle type, or radians by default.

  See HELP CTU() for more on the angle type.
& TEL()
  tel(<object>,<destination>)

  This function will teleport <object> to <destination>, exactly as
  @tel <object>=<destination>.

  See also: @tel
& TEXTFILE()
  textfile(<type>,<entry>)

  textfile() returns the text of entries from cached text files (such as
  "help", "news", "events", etc.) All whitespace and newlines are included,
  so you may want to edit %r's and squish the result if you plan to use
  the text as a list of words rather than a display.

  Examples: 
  > say textfile(help,tel\()
  You say, "  tel(<object>,<destination>)

    This function will teleport <object> to <destination>, exactly as
    @tel <object>=<destination>.

    See also: @tel
  "
& TIME()
& UTCTIME()
  time([utc])
  utctime()

  time() gives you the current time on the MUSH.
  WARNING!  This is the time on the machine that the mush is running
  on, and not where you are.

  utctime() and time(utc) give the same time in UTC (Aka GMT), not the
  server's local timezone.

  See also: timefmt(), timestring(), convsecs(), convtime()
& ETIMEFMT()
  etimefmt(<format>[, <secs>])

  This function is similar to timestring() - it formats an elapsed time
  into days, hours, minutes and seconds. However, its formatting is
  much more versatile than timestring(), as well as being more complex.

  Escape codes in <format> are replaced by the proper values, and other
  characters are left unchanged.

  A list of all codes is in HELP ETIMEFMT2

  Examples:
  > say etimefmt(I have been connected for $2H:$2M., conn(%#))
  You say, "I have been connected for 01:32."
  > think etimefmt($2mm $2ss, 500) - [timestring(500)]
   8m 20s -  8m 20s

  See also: timestring(), timefmt()
& ETIMEFMT2
  etimefmt()'s escape codes are similar to timefmt()'s.
  The time is broken up into days, hours, minutes, and seconds, and
  each value replaces the matching code.

  $s - The number of seconds.    $h - The number of hours.
  $S - The number of seconds,    $H - The number of hours,
       left-padded with 0.            left-padded with 0.
  $m - The number of minutes.    $d - The number of days.
  $M - The number of minutes,    $D - The number of days,
       left-padded with 0.            left-padded with 0.
  $$ - A literal $.

  You can also put a number between the $ and letter to specify
  a minimum width for the expanded code. The capital letter codes
  are the same as the lower case codes if you don't provide a width.
& TIMEFMT()
  timefmt(<format>[, <secs>])

  This function takes a format and a time in seconds (Or the current time)
  and returns the format with escape sequences in it expanded to the
  proper values based on the time, relative to the host the server is
  on.

  A list of all codes is in HELP TIMEFMT2

  Example:
  > think timefmt($A\, the $dth day of $B.)
  Monday, the 17th day of July.
& TIMEFMT2
  All escape codes start with a $. To get a literal $, use $$.
  Invalid codes will return #-1 INVALID ESCAPE CODE. Other text will be
  passed through unchanged.

  $a - Abbreviated weekday name  $p - AM/PM  ($P may also work)
  $A - Full weekday name         $S - Seconds after the minute
  $b - Abbreviated month name    $U - Week of the year from 1rst Sunday
  $B - Full month name           $w - Day of the week. 0 = Sunday
  $c - Date and time             $W - Week of the year from 1rst Monday
  $d - Day of the month          $x - Date
  $H - Hour of the 24-hour day   $X - Time
  $I - Hour of the 12-hour day   $y - Two-digit year
  $j - Day of the year           $Y - Four-digit year
  $m - Month of the year         $Z - Time zone
  $M - Minutes after the hour    $$ - $ character.
& TIMESTRING()
  timestring(<seconds>[,<pad flag>])

  The timestring function takes a number of seconds as input and
  returns the amount of time formatted into days, hours, minutes, and
  seconds. If <pad flag> is 1, all time periods will be used even
  if the number of seconds is less than a day, hour, or minute.
  If <pad flag> is 2, all numbers will be 2 digits long.

  Example:
  > say [timestring(301)]
  You say, " 5m  1s"
  > say [timestring(301,1)]
  You say, "0d  0h  5m  1s"
  > say [timestring(301,2)]
  You say, "00d 00h 05m 01s"

& TRIM()
  trim(<string>[,<character to trim>][,<trim style>])
 
  This function trims leading and trailing characters from a string.
  The character trimmed is normally a space; if a second argument is
  provided, however, that character will be used instead.
  
  If no trim style is specified, characters are trimmed from both the
  left and right sides of the string. If the 'l' trim style is specified,
  characters are only trimmed from the left side. If the 'r' trim style
  is specified, characters are only trimmed from the right side. If you
  specify a trim style, you must also explicitly specify the character
  to trim, since the trim style must be the third argument to the function.
 
   Examples:
      > say [trim(   foo bar baz   eek  )]
       You say, "foo bar baz   eek"
      > say [trim(***BLAM***,*)]
       You say, "BLAM"
      > say [trim(-----> WOW---,-,r)]
       You say, "-----> WOW"

& TRUNC()
& VAL()
  trunc(<string>)
  val(<string>)
  
  This function truncates floating point numbers to integers. It can
  also be used to return the leading numeric prefix of a string, or
  "0" if there isn't one. For example, "val(101Dalmations)"  => 101.
  
& TYPE()
  type(<object>)

  This function returns the type of an object - PLAYER, THING, EXIT,
  or ROOM. See "help types of objects" for more.
& U()
& UFUN()
  u([<object>/]<user function name>, <arg 0>, <arg 1>, ...)
  ufun([<object>/]<user function name>, <arg 0>, <arg1>, ...)
 
  This allows you to create your own functions and evaluate them.
  <user function name> is the attribute that contains the desired
  user-defined function. Supplying <object> is optional; if you
  do not, the attribute will be read off the object that is
  evaluating the UFUN().
  
  <arg 0>, <arg 1>, ... are the arguments that get passed to the
  user function as v(0), v(1), etc. (as in @trigger).  You can pass
  up to 10 arguments (v(0) through v(9)); extra arguments will be
  evaluated but not accessible (since v(10) refers to an attribute,
  not another argument).
  
  This function is also known as U()  (alias for TinyMUSH compatibility).

  See "help UFUN2" for more.
  
& U2
& UFUN2
  Example:
  
  > @va Object=$test *:"[ufun(testfun, v(0))]; @emit [v(0)]
  >
 &testfun object=[strlen(v(0))] [ucstr(v(0))]
  > test string
  Foo says, "6 STRING"
  string
  
  See "help UFUN3" for more.
 
& U3
& UFUN3
  A user-defined function may be as complex as you want it to be.
  If the evaluation order doesn't quite seem right, adding escapes
  or breaking up the expression will probably help.
    
  Excessive recursion in either a UFUN() or ZFUN() will cause it to
  return "#-1 EXCESSIVE RECURSION ERROR", and sets the object HALT.
  An object which is HALT may not evaluate either UFUN() or ZFUN();
  those functions will then return "#-1 OBJECT HALTED".
  
& UCSTR()
  ucstr(<string>)

  Returns <string> with all letters converted to uppercase.
  Example: ucstr(Foo BAR baz) returns "FOO BAR BAZ"
& UDEFAULT()
  Function:  udefault([<obj>/]<attr>,<default case>[,<arg>]...)
 
  This function returns the value of the user-defined function
  as defined by <attr> (or <obj>/<attr>), as if retrieved via
  the u() function, with <args>, if the attribute exists and is
  readable by you.
 
  Otherwise, it evaluates the default case, and returns that. The
  default case is only evaluated if the attribute does not exist
  or cannot be read.
 
  Examples:
    > &TEST me=[center(%0,5,*)]
    > say udefault(Test,-- BOOM --,ACK)
    You say "*ACK*"
    > &TEST me
    > say udefault(me/Test,-- BOOM --,ACK)
    You say "-- BOOM --"
 
  See also: get(), eval(), ufun(), uldefault(), default(), edefault()
& ULDEFAULT()
  uldefault([<obj>/]<attr>,<default case>[,<arg>]...)

  Just like UDEFAULT(), but it preserves registers like ULOCAL().

  See also: u(), udefault(), ulocal(), setq()
& ULOCAL()
  Function:  ulocal([<obj>/]<attr>[,<arg>]...)
 
  The ulocal() function is almost identical to u() in function:  it
  evaluates an attribute, either from the object performing the function,
  or another object that you control or has the same owner as you, passing
  in arguments and returning the result. When evaluating the fetched
  attribute, %# refers to the original enactor and not the 'calling' object;
  'me' refers to the object that supplied the attribute.
 
  However, unlike the u() function, the global registers r(0) through r(9)
  (%q0 - %q9) are preserved in their initial state. This means that functions
  "below" the level of the u() can reset global registers for temporary
  calculations, without needing to worry about "clobbering" the original
  values.
 
  This makes ulocal() particularly useful for global or shared code which
  calls arbitrary u() functions, where global register values need to be
  preserved from accidental user clobbering.
 
  See "help ulocal2" for examples.
 
& ULOCAL2
  Example of ulocal():
    > &FRUIT me=apples bananas oranges pears
    > &SUB-FUNCTION me=[setq(0,v(FRUIT))][extract(%q0,match(%q0,%0),1)]
    > &TOP-FUNCTION me=[setq(0,are delicious!)][ulocal(SUB-FUNCTION,%0)] %q0
    > say u(TOP-FUNCTION,b*)
    You say "bananas are delicious!"
 
  If SUB-FUNCTION had been called with u() instead of ulocal():
    > &TOP-FUNCTION me=[setq(0,are delicious!)][u(SUB-FUNCTION,%0)] %q0
    > say u(TOP-FUNCTION,b*)
    You say "bananas apples bananas oranges pears"
 
  In this second example, in SUB-FUNCTION, %q0 was set to "apples bananas
  oranges pears", so that when the u() "returned" and TOP-FUNCTION evaluated
  %q0, this is what was printed. In the first example, ulocal() reset the
  value of %q0 to its original "are delicious!"
 
  See also: u(), setq(), r()
 
& V()
& V-FUNCTION
  V(<name of attribute>)
  V(<variable name>)

  The first form of this function works just like get(me/<attribute name>).
  It is faster and more efficient than get(), however, and so it's better
  to use v() when you are getting attributes off an object or its parents.

  The second form of this function provides a different way of getting the
  results of %-substitutions like %#, %N, %0, etc. Simply take the variable
  name (whatever follows the % symbol) and put it inside the v() function:

       v(N) is equivalent to %N
       v(!) is equivalent to %!
       v(3) is equivalent to %3

  See also: SUBSTITUTIONS, get(), ATTRIBUTES

& VADD()
  vadd(<vector>,<vector>[,<delimiter>])

  Returns the sum of two vectors. A vector is a list of numbers
  separated by spaces or a delimiter.

  > think vadd(1 2 3,4 5 6)
  5 7 9
  > think vadd(0|0|0,1|2|3,|)
  1|2|3
& VALID()
  valid(<category>,<string>)

  The valid() function checks to see if <string> is a valid member of
  <category>, and returns 1 if it is, 0 if not, and #-1 if an
  invalid category is used.
  
  The categories are:
   name        Test for a valid object name.
   attrname    Test for a valid attribute name.
   playername  Test for a valid player name that can be set with
                @name or @alias.

  > think valid(name,Foobar)
  1 
  > think valid(attrname,Foo bar)
  0

& VDIM()
  vdim(<vector>[,<delimiter>])

  Returns the dimensionality of a vector.

  > think vdim(1 2 3 4)
  4
& VDOT()
  vdot(<vector>,<vector>[,<delimiter>])
  
  Returns the dot product of two vectors. A dot product is the sum
  of the products of the corresponding elements of the two
  vectors, e.g. vdot(a b c,d e f) = ad + be + cf.
  The vectors must be of the same length.
  
  > think vdot(1 2 3,2 3 4)
  20
& VMIN()
  vmin(<vector>, <vector>[, <delimiter>])

  Returns a new vector made out of the minimums of each
  corresponding pair of numbers from the two vectors.
  The vectors must be of the same length.

  > think vmin(1 2 3, 4 1 2)
  1 1 2
& VMAX()
  vmax(<vector>, <vector>[, <delimiter>])

  Returns a new vector made out of the maximums of each
  corresponding pair of numbers from the two vectors.
  The vectors must be of the same length.

  > think vmin(1 2 3, 4 1 2)
  4 2 3

& VERSION()
  Function: version()
 
  Returns a string which contains various version information for the MUSH
  you're on.
 
  Example:
     > say version()
     You say "PennMUSH version 1.6.0 patchlevel 0 [1/10/96]"

& VISIBLE()
  visible(<object>,<victim>[/<attribute>])
  
  If no attribute name is provided, this function returns 1 if 
  <object> can examine <victim>, or 0, if it cannot. If an
  attribute name is given, the function returns 1 if <object>
  can see the attribute <attribute> on <victim>, or 0, if it
  cannot.
  
  If <object>, <victim>, or <attribute> is invalid, the function
  returns 0.
 
& VMAG()
  vmag(<vector>[,<delimiter>]

  Returns the magnitude of a vector, using a Euclidean distance metric.
  That is, for vector a b c d, returns sqrt(a^2+b^2+c^2+d^2).

  > think vmag(3 4) 
  5
& VMUL()
  vmul(<vector|number>,<vector|number>[,<delimiter>])

  Returns the result of either multiplying a vector by a number,
  or the element-wise product of two vectors. The element-wise product
  of a b c by w x z is aw bx cz

  > think vmul(1 2 3,2)
  2 4 6
  > think vmul(1 2 3,2 3 4)
  2 6 12
& VSUB()
  vsub(<vector>,<vector>[,<delimiter>])

  Returns the difference between two vectors.

  > think vsub(3 4 5,3 2 1)
  0 2 4
& VUNIT()
  vunit(<vector>[,<delimiter>]

  Returns the unit vector (a vector of magnitude 1), which points
  in the same direction as the given vector.

  > think vunit(2 0 0)
  1 0 0
  > think vmul(vunit(5 6 7),vmag(5 6 7))
  5 6 7
 
& WHERE()
  where(<object>)
  
  This function returns the "true" location of an object. This is
  the standard location (i.e. where the object is) for things and
  players, the source room for exits, and #-1 for rooms.
  
  In other words, the "true" location of an object is where it is
  linked into the database. For example, an exit appears in the 
  room of its "home", not its "location" (the LOC() function on an
  exit will return the latter). A room's "real" location is always
  Nothing (the LOC() function will return its drop-to).
  
& WIPE() 
  wipe(<obj>/<attribute-pattern>)

  This function is equivalent to @wipe. It returns nothing. 
  
& WORDPOS()
  wordpos(<string>, <number>[, <delimiter>])

  Returns the number of the word within <string> where the <number>th
  character falls. Characters and words are numbered starting with 1,
  and spaces between words are treated as belonging to the word that
  follows them. If <number> is not within the string, #-1 is returned.
  Example: wordpos(foo bar baz, 5) returns "2"
& WORDS()
  words(<string>[,<delimiter>])

  words() returns the number of words in a string.
& WRAP()
  wrap(<string>, <width>[, <first line width>[, <line separator>])

  This function takes <string> and splits it into lines containing
  no more than <width> characters each. If <first line width> is
  given, the first line may have a different width.  If <line separator>
  is given, it is inserted between each line; by default the 
  separator is a newline.

  Examples:
  @desc here=[wrap(Wrapped paragraph,72)]
  @desc here=[wrap([space(4)]Indented paragraph,72)]
  @desc here=[iter(wrap(Hanging indent,72,76,|),
                   [switch(#@,>1,space(4))]##,|,%r)]

& XGET()
  xget(<object>, <attribute>)
  
  This function is identical to get() in purpose, but a comma instead of
  a slash separates object and attribute. There is no real advantage to
  using this instead of get(). Please see "help get()" for more details
  on the use of this function.
  
& XOR()
  [xor(<boolean value>,<boolean value>)]

  Takes two booleans, and returns a 1 if one, and only one of the two
  inputs is equivalent to true(1).  See BOOLEAN VALUES.

  See also: and(), or(), not(), nor()
& ZEMIT()
  zemit(<zone>, <message>)

  Sends a message to everything zoned to <zone>, as per @zemit.
  Costs apply.

& ZFUN()
  zfun(<user function name>, <arg 0>, <arg1>, ... <arg8>)
 
  This is essentially identical to UFUN(), but the attribute corresponding
  to the user function name is read from the ZMO of the object instead
  of from the object itself. In order to read the attribute from the ZMO,
  one of the following criteria must be met:
 
  1. The object is set WIZARD or ROYALTY.
  2. The object controls the ZMO.
  3. The object's owner owns the attribute on the ZMO.
  4. The ZMO is set VISUAL.
  5. The attribute being checked is set VISUAL.
 
  See the help for UFUN() for more details on user-defined functions.
& ZONE()
  zone(<object>[, <new zone>])
 
  Returns the object's 'zone'. This is the dbref of the master object
  which defines the zone.  If the second argument is specified, the
  function tries to change the zone on the object before reporting it.

  See also: ZONES
& mail
& @mail
  @mail[/<switches>] [<msg-list> [= <target>]]
  @mail[/<switches>] <player-list> = [<subject>/]<message>
 
  @mail invokes the built-in MUSH mailer, which allows players to send
  and receive mail. Pronoun/function substitution is performed on
  any messages you may try to send.  

  A <msg-list> is one of the following:
        A single msg # (ex: 3)
        A message range (ex: 2-5, -7, 3-)
        A folder number and message number/range (ex: 0:3, 1:2-5, 2:-7)
        A sender (ex: *paul)
        An age of mail in days (ex: ~3 (exactly 3), <2, >1)
           "days" here means 24-hour periods from the current time.
        One of the following: "read", "unread", "cleared", "tagged",
        "urgent", "all" (all messages in all folders), "folder" (all
        messages in current folder)
  A <player-list> is a space-separated list of recipients, which may be:
        Player names
        Player dbref #'s
        Message #'s, in which case you send to the sender of that message.
        An alias name (see help @malias)

  See also the following topics:  mail-sending   mail-reading   
      mail-folders   mail-other   mail-admin     @malias
& mail-reading

  @mail <msg #>
  @mail/read <msg-list>
        This displays messages which match the msg# or msg-list from
        your current folder.
  
  @mail
  @mail <msg-list, but not a single msg #> 
  @mail/list <msg-list>
        This gives a brief list of all mail in the current folder,
        with sender name, time sent, and message status.
        The status field is a set of characters (ex: NC-UF+) which mean:
                N = New (unread) message
                C = Cleared message
                U = Urgent message
                F = Forwarded message
                + = Tagged message
        The opposites of these (read messages, etc.) are indicated with a
        '-' in the status field in that position.
        
& mail-sending 
  @mail[/switch] <player-list> = [<subject>]/<msg>
        This sends the message <msg> to all players in <player-list>.
        If no subject is given, the message subject is the beginning
        of the message itself.
        All function substitutions are valid in <msg> including mail(#) which
        will allow you to forward mail you have received to other users.
        The following switches are available:
                /send   - same as no switch
                /urgent - mail is marked as "Urgent"
                /silent - no notification to sender that mail was sent
                /nosig  - no mail signature
        If you have an @mailsignature attribute set on yourself, its
        contents will be evaluated and appended to the message unless
        the /nosig switch is given.
 
  @mail/fwd <msg-list> = <player-list>
        This sends a copy of all the messages in <msg-list> to
        all the players in <player-list>. The copy will appear to have
        been sent by you (not the original sender), and its status will
        be "Forwarded".

& mail-other
  @mail/clear [<msg-list> | all]
  @mail/unclear [<msg-list> | all]
        These commands mark mail in the current folder as cleared or uncleared.
        Mail marked for clearing is deleted when you disconnect, or
        if you use @mail/purge. If no msg-list is specified, all
        mail in your current folder is cleared. If "all" is given instead
        of a msg-list, all mail in *all* folders is cleared/uncleared.
  
  @mail/purge
        Actually deletes all messages marked for clearing with @mail/clear.
        This is done automatically when you log out.

  @mail/tag [<msg-list> | all>]
  @mail/untag [<msg-list> | all>]
        These commands tag or untag mail in the current folder.
        Tagged mail can be later acted on en masse by using "tagged" as
        the msg-list for other commands (which does *not* untag them
        afterward). If no msg-list is specified, all messages in the
        current folder are tagged/untagged. If "all" is given as the
        msg-list, all mail in *all* folders is tagged/untagged.
        (Ex: To clear all mail from Paul and Chani, @mail/tag *paul,
        @mail/tag *chani, @mail/clear tagged, @mail/untag all).
& mail-folders
  The MUSH mail system allows each player 16 folders, numbered from
  0 to 15. Mail can only be in 1 folder at a time. Folder 0 is
  the "inbox" where new mail is received. Most @mail commands
  operate on only the current folder.

  @mail/folder
        This commands lists all folders which contain mail, telling
        how many messages are in each, and what the current folder is.

  @mail/folder <folder#|foldername>
        This command sets your current folder to <folder#>.

  @mail/folder <folder#> = <foldername>
        This command gives <folder#> a name. 

  @mail/unfolder <folder#|foldername>
        This command removes a folder's name

  @mail/file <msg-list>=<folder#>
        This command moves all messages in msg-list from the current
        folder to a new folder, <folder#>.
& mail-admin
  
  The @mail command can also take the following switches:
  
    @mail/stats [<player>]    --  Basic mail statistics.
    @mail/dstats [<player>]   --  Also provides read/unread count.
    @mail/fstats [<player>]   --  Does all that, plus gives space usage.
  
    @mail/debug <action>[=<player>]
    @mail/nuke
  
  Only wizards may stats players other than themselves. The mail statistics
  commands are computationally expensive, and thus are subject to "daytime"
  restrictions. They also cost the same as a @find (100 pennies).
  
  The /debug switch does sanity checking on the mail database, and may only
  be used by a wizard. "@mail/debug sanity" just does the check; the command
  "@mail/debug clear=<player name or dbref number>" wipes mail for an object.
  "@mail/debug fix" attempts to repair problems noted in the sanity check.

  The /nuke switch destroys the post office, erasing all @mail everywhere.  
  It may only be used by God.
  
& @malias
@malias [<alias>]

The @malias command is used to create, view, and manipulate @mail
aliases, or lists. An alias is a shorthand way of specifying a list
of players for @mail. Aliases begin with the '+' (plus) prefix,
and represent a list of dbrefs; aliases may not include other aliases.

@malias with no arguments lists aliases available for your use,
and is equivalent to @malias/list

@malias with a single argument (the name of an alias) lists the
members of that alias, if you're allowed to see them. Other forms of
the same command are @malias/members <alias> or @malias/who <alias>

See help @malias2 for more

& @malias2
@malias[/create] <alias>=<player list>
@malias/desc <alias>=<Description>
@malias/rename <alias>=<newalias>
@malias/destroy <alias>

The first form above creates a new alias for the given list of players.
@malias/desc sets the alias's description, which is shown when aliases
are listed.
@malias/rename renames an alias.
@malias/destroy destroys the alias completely.

See help @malias3 for more.
& @malias3
@malias/set <alias>=<player list>
@malias/add <alias>=<player list>
@malias/remove <alias>=<player list>

@malias/set resets the list of players on the alias to <player list>.
@malias/add adds players to the alias. Note that the same player
may be on an alias multiple times.
@malias/remove removes players from the alias. If a player is on the
alias more than once, a single remove will remove only one instance
of that player.

See help @malias4 for more.
& @malias4
@malias/use <alias>=<perm list>
@malias/see <alias>=<perm list>

@malias/use controls who may use an alias. Players who may use an
alias will see it in their @malias list, and can @mail to the
alias.
@malias/see controls who may list the members of an alias.

An empty permission list allows any player. The permission list
may also be a space-separated list of one or more of "owner",
"members" (of the alias), and "admin".

By default, the owner and alias members may see and use the alias,
but only the owner may list the members.  Note that admin may always
list aliases and their members, regardless of these settings, but are
treated like anyone else when trying to @mail with an alias.

See help @malias5 for more.
& @malias5
@malias/all
@malias/stat
@malias/chown <alias>=<player>
@malias/nuke

@malias/all is an admin-only command that lists all aliases in the MUSH.
@malias/stat is an admin-only command that displays statistics about the
number of aliases and members of aliases in use.
@malias/chown is a wizard-only command that changes the owner of an alias.
@malias/nuke is a God-only command that destroys all aliases.
& PUEBLO
& PUEBLO()
Pueblo is a client made by Chaco (a now defunct company).
It attempts to mix HTML with MUSH, and does a decent job at it.
There are other clients (notably MUSHclient) that also offer Pueblo 
features.  If compiled into the MUSH, PennMUSH offers support for
the enhanced features of Pueblo.

PennMUSH will automatically detect a Pueblo client (rather, the 
client will announce itself and PennMUSH will detect that), and
set up that connection for Pueblo use. 

The PUEBLO() function returns 1 for players connected with Pueblo, 
0 for players with other clients, and #-1 NOT CONNECTED for
players who aren't connected. It uses the most recently active
connection if a player is multiply logged in.

For more information, see 'Pueblo features', 'HTML' and
'HTML Functions'. 

& PUEBLO FEATURES
PennMUSH makes the following enhancements visible to Pueblo users, if
Pueblo support has been enabled in the server (check @config):

- Object/Room names are highlighted
- Support for VRML graphics
- Unordered list for contents and transparent exits
- Contents and links have links (Click an exit to walk through it)
- Object lists (like the ones found in 'examine') have links
- Conversion of ANSI sequences to <FONT> tags.

See 'HTML', 'HTML Functions' and '@VRML_URL' for more help.

& @VRML_URL
& VRML
@VRML_URL Object=<URL>

This provides an object (usually a room) with a VRML world. When a 
Pueblo-user enters this object, the VRML World listed in @VRML_URL
will be loaded.

Example:
@VRML_URL here=http://www.pennmush.org/pennmush.vrml

To learn about the VRML Format, have a look at the Pueblo Help, which
mentions several good sites for learning.

See also 'HTML'.

& HTML
Hyper Text Markup Language (http://www.w3.org)

The only HTML implementation supported by the MUSH is the one
supported by Pueblo (See 'Pueblo'). To utilize HTML, use
one of the MUSH HTML Functions. (See 'HTML Functions').

HTML tags are stripped when sent to non-HTML capable players.

See 'HTML Functions'.
& HTML FUNCTIONS
HTML Functions are used to output HTML tags to HTML capable
users. These tags will be stripped by the system for anything
non-HTML related. These functions will not be available if
the server is compiled without Pueblo support (check @config).

html()
tag()
endtag()
tagwrap()

Examples:
  [html(A HREF="http://www.pennmush.org")]PennMUSH[html(/A)]
  [tag(A,HREF="http://www.pennmush.org")]PennMUSH[endtag(A)]
  [tagwrap(A,HREF="http://www.pennmush.org",PennMUSH)]
Each of these produces the HTML output:
  <A HREF="http://www.pennmush.org">PennMUSH</A>

Mortals are restricted in the tags they may use. Most standard HTML
tags are ok; protocol-specific tags like SEND and XCH_CMD can only be
sent by Wizards. In addition, the html() function is Wizard-only.
& HTML()
Function: html(<string>)

This wizard-only function will output string as a HTML Tag.

Example:
  think [html(B)]

Will output (in HTML):
  <B>

Non-wizards should see the tag(), endtag(), and tagwrap() functions.
& TAG()
Function: tag(<name>,[param1[,param2...]])

This will output the tag 'name' with values from it's parameters.

Example:
 [tag(IMG,SRC=http://www.pennmush.org/someimage.jpg,ALIGN=LEFT,WIDTH=300)]

Will output (in HTML):
 <IMG SRC=http://www.pennmush.org/someimage.jpg ALIGN=LEFT WIDTH=300>

& ENDTAG()
Function: endtag(<name>)

This will output an end tag 'name'.

Example:
 [endtag(IMG)]

Will output (in HTML):
 </IMG>

& TAGWRAP()
Function: tagwrap(<tag>[,<parameters>],<string>)

This will output 'tag' with parameters, followed by 'string', and then
a closing tag for 'tag'. 

Example:
 [tagwrap(A,HREF=http://lists.pennmush.org,PennMUSH Lists)]
Will output (in HTML):
 <A HREF=http://lists.pennmush.org>PennMUSH Lists</A>

A particularly important use of this function is tagwrap(PRE,<string>).
Because Pueblo works like an html browser, spaces and tabs are compressed
to a single space. If you have code (a +who function, for example) that
relies on exact spacing, surround its output with a tagwrap(PRE,...)
so that Pueblo will render it as "preformatted" text.

& help
This is the index to the MUSH online help files.

  For an explanation of the help system, type:    help newbie

  For the list of MUSH commands, type:            help commands
  For the list of MUSH topics, type:              help topics
  For an alphabetical list of all help entries:   help entries 
  For information about PennMUSH:                 help code
  
  For a list of flags:                            help flag list
  For a list of functions:                        help function list 
  For a list of attributes:                       help attribute list
  To see the configuration of this MUSH:          @config

  On many MUSHes, list local commands with:       +help

If there are any errors in the help text, please notify a wizard
in the game, or send mail to dunemush@pennmush.org.
  
& newbie
  
  If you are new to MUSHing, the help files may seem confusing. Most of
  them are written in a specific style, however, and once you understand
  it the files are extremely helpful.

  The first line of a help file on a command or function will normally be
  the syntax of the command. "Syntax" means the way the command needs to
  be typed in. In the help files, when the syntax of a command is described,
  square brackets [] mean that that part of the command is optional and
  doesn't have to be typed in. Also, pointy brackets <> mean that that part
  of the command needs to be replaced with a specific piece of information.
  
  You should not type the [] or <> brackets when entering a command.
  
(continued in help newbie2 -- type 'help newbie2' without the single quotes)
  
& newbie2

  For example, the syntax of the help command is:
  
  help [<topic>]
  
  What this means is that to get help, you would type first the word "help" and
  then you could optionally type the name of a more specific topic in order
  to get help on that topic. Just typing "help" will work too (that's why the
  <topic> part is optional).
  
  Some common commands that you should look at help for are:
  
    look   say    go    page    pose    take     give    home
  
  Just type help <command> for help. Example: help page
  
(continued in help newbie3)
& newbie3

  There is help available on every standard MUSH command. If you see a command
  or someone mentions one to you that you want to know more about, try just
  typing: help <command name> -- that will most likely bring up the help
  file on it.
  
  Please note that just because there is help available on a command does
  not necessarily mean that the command can be used on this MUSH. The
  siteadmin of the MUSH can choose to turn off some commands. If there's
  something that you would like available, and it isn't, please ask a wizard
  why not.
  
  It is also highly recommended that any new player read the MUSH manual,
  written by Amberyl. It is available by anonymous FTP from:
     ftp.pennmush.org
  in the directory:
     /pub/PennMUSH/Manuals

& topics
Help is available on the following topics:

  ACTION LISTS             ATTRIB-OWNERSHIP         ATTRIBUTES 
  BEING KILLED             BOOLEAN VALUES           CHAT
  CLIENTS                  CONTROL                  COPYRIGHT  
  COSTS                    CREDITS                  DBREFS 
  DROP-TO                  ENACTOR                  EVALUATION 
  EXECUTOR                 EXITS                    FAILURE
  FLAGS                    FUNCTIONS                GENDER 
  GLOBALS                  HERE                     HOMES
  INTERIORS                LINKING                  LISTENING
  LISTS                    LOOPING                  MASTER ROOM 
  MATCHING

(continued in help topics2)
& topics2
  ME                       MONEY                    MUSHCODE
  NON-STANDARD ATTRIBUTES  PARENTS                  POWERS
  PUPPETS                  QUEUE                    REGEXPS
  REGISTERS                SEMAPHORES               SETTING-ATTRIBUTES       
  SPOOFING                 STACK                    STRINGS                  
  SUBSTITUTIONS            SUCCESS                  SWITCHES                 
  TYPES OF OBJECTS         USER-DEFINED COMMANDS    VERBS                    
  WARNINGS                 WILDCARDS                ZONE MASTER ROOMS        
  ZONE MASTERS             ZONES  
  
Type "help <topic name>" for help.
& ACTION LISTS
  Action lists are simply lists of actions that are all executed at once.
  You can have an action list in a user-defined command, in one of the
  a-attributes, or in many other commands.

  Actions in an action list are separated by semicolons. Each action is 
  simply a separate MUSH command. If part of the action (such as the text
  in an @emit, for example) contains a semi-colon or comma, you may need
  to enclose that part in curly braces {}. You can also nest action lists
  inside each other by enclosing each action list in braces {}.

  Substitution will be performed on the contents of action lists before
  they are executed.

(continued in help action2)
& ACTION2
  Example 1:
    > @asuccess Gift = @pemit %#={The box pops open; surprise!} ; 
        @name me=New Toy ; @desc me={A shiny new toy, just for %N!}
    > take gift
    The box pops open; surprise!
    > look new toy
    New Toy
    A shiny new toy, just for Cyclonus!
            
  Example 2:
    > &TEST me=$test:@emit {Testing; testing; one, two.} ; 
        @dolist 1 2 3={think {Test ##, success.} }
    > test
    Testing; testing; one, two.
    Test 1, success.
    Test 2, success.
    Test 3, success.

  See also: ATTRIBUTES, SUBSTITUTION, @asuccess, @dolist
& ATTRIB-OWNERSHIP
  ATTRIBUTE OWNERSHIP
  
  The first person who creates an attribute on an object is the owner
  of that attribute. If you lock an attribute, using the @atrlock command,
  only the person who owns the attribute will be able to alter the
  attribute. This allows you to create standard commands on objects and
  then @chown them to others without letting them alter them. 

  Attribute ownership is NOT changed when the object itself is @chown'ed.
  To change attribute ownership, you must use the @atrchown command.

  You must control an object in order to set attributes on it.

  See also: @atrlock, @atrchown, ATTRIBUTES
& ATTRIBUTES
& ATTRIBUTES LIST
& ATTRIBUTE LIST
  Attributes with (*) after them are special, cannot be set by players,
  and may only be visible to wizards or admin. For those attributes, there
  is no @-command, so you can just type 'help <attribute name>' for help.
  For all other attributes, type 'help @<attribute name>' for help.

Standard Attributes: (see @list/attribs for the complete list)
  AAHEAR        ACLONE        ACONNECT      ADEATH        ADESCRIBE
  ADISCONNECT   ADROP         AEFAIL        AENTER        AFAILURE
  AHEAR         ALEAVE        ALFAIL        AMHEAR        AMOVE
  APAYMENT      ASUCCESS      AWAY          CHARGES       COST 
  DEATH         DESCRIBE      DROP          EALIAS        EFAIL         
  ENTER         FAILURE       FORWARDLIST   HAVEN         IDESCRIBE     
  IDLE          LALIAS        LAST (*)      LASTIP (*)    LASTLOGOUT(*) 
  LASTSITE (*)  LEAVE         LFAIL         LISTEN        MOVE          
  ODEATH        ODESCRIBE     ODROP         OEFAIL        OENTER        
  OFAILURE      OLEAVE        OLFAIL        OMOVE         OPAYMENT      
  OSUCCESS      OXENTER       OXLEAVE       OXMOVE        PAYMENT       
  QUEUE (*)     RQUOTA (*)    RUNOUT        SEX           STARTUP       
  SUCCESS       TFPREFIX

(continued in help attributes2)
& ATTRIBUTES2
  An attribute is part of the code on an object that makes it unique. An
  attribute can contain any sort of text -- from a single word, to a long
  paragraph, to a piece of MUSHcode. Some attributes are standard in 
  PennMUSH. That means that their effects are pre-set. 

  Standard attributes can be set using one of the following commands:
    @<attribute name> <object>=<content>
    @set <object>=<attribute name>:<content>
    &<attribute name> <object>=<content>

  It is also possible to have non-standard attributes, which can be named 
  anything you like. Please see help NON-STANDARD ATTRIBUTES for more 
  information on those. 

(continued in help attributes3)
& ATTRIBUTES3
  Any attribute name can be shortened, but a shorter forms run the risk
  of conflicting with other attribute names.  This could result in you
  setting an unwanted attribute. 

  For example:
    @adesc me=think %N looks at you.
  will set your ADESCRIBE attribute just as
    @adescribe me=think %N looks at you.
  would.

  To see the attributes that are set on you or on any of the objects you own,
  you should use the "examine" command. This will list all of the attributes
  and their contents. As this can get very spammy for any large object, you
  can also examine specific attributes by using this format:
    examine <object>/<attribute>
  
(continued in help attributes4)
& ATTRIBUTES4
  Attributes can be owned by someone other than the object they are set on.
  This allows the person to change the content of just that attribute while 
  not the rest of the object. Attributes can also be locked, which prevents
  them from being changed by anyone.

  In addition to the standard attributes with pre-set effects, there are
  some special attributes that date from the days before you could set
  non-standard attributes with any name you wanted. These are the 
  attributes VA-VZ, WA-WZ, XA-XZ. These attributes have no pre-set effects,
  and were just to allow players to store any text or MUSHcode that they
  wished in those attributes. Now that non-standard attributes are available,
  it is highly recommended that you instead use them, since you can use
  longer and descriptive names for attributes, which makes it much easier
  to examine and work on objects.

  See also: ATTRIB-OWNERSHIP, @set, examine, @atrchown, @atrlock, hasattr()
          get(), v(), NON-STANDARD ATTRIBUTES, SETTING-ATTRIBUTES
& BEING KILLED
 
  Getting killed is no big deal. If you are killed, you return to
  your home, and  all things you carry return to their homes. You 
  also collect 50 pennies in insurance money (unless you have >= 10000 
  pennies or you were killed via the Wizard slay command). See MONEY.  
  Generally, killing is not encouraged unless absolutely necessary.
  It can be extremely rude and annoying.

  Many MUSHes choose to disable the kill command.

  See also: kill, slay, @death
& BOOLEAN VALUES 

  A boolean variable, for those of you not familiar with programming, 
  is a variable that is either true or false. Normally, a value of
  1 is considered "true" and a value of 0 is considered "false". Many
  MUSH functions return either 1 if they are true or 0 if false.
  For example, the hasflag() function tests to see if an object has
  a certain flag set on it. If
        hasflag(<object>,<flag name>) 
  is true (the object has the flag), it will return 1. If it is false, 
  it will return 0. 

  Other functions expect to operate on boolean values. What they
  consider "true" or "false", however, depends on the setting of
  the "tiny_booleans" config option (@config tiny will show this).  

(continued in help boolean2)
& BOOLEAN2 
  If tiny_booleans is...
  no                       FALSE: null string, 0, any negative db
                           TRUE:  everything else
  yes                      TRUE:  numbers other than 0
                                  strings beginning with numbers other than 0
                           FALSE: everything else 
  
  Or, put another way:
  Value                 tiny_booleans=no        tiny_booleans=yes  Gotcha
  0                     FALSE                   FALSE
  non-zero number       TRUE                    TRUE 
  #<non-negative>       TRUE                    FALSE               *
  #<negative>           FALSE                   FALSE                
  null string           FALSE                   FALSE
  0<non-numbers..>      TRUE                    FALSE               *
  <non-numbers...>      TRUE                    FALSE               *

(continued in help boolean3)
& BOOLEAN3

  Examples (assuming tiny_booleans is "no"):     
    not(foo) = 0  
    not(<null string>) = 1
    not(-66) = 0
    not(0) = 1
    not(#-1) = 1
    not(#12) = 0
  And so on...
  (note: These rules only apply when a function expects a Boolean
  value, not for strings that expect other values.)

  See also: BOOLEAN FUNCTIONS, not(), t()
& CLIENTS
  Clients are special software programs that you can use to connect to 
  MUSHes. They are usually much nicer to use than raw telnet and give you
  many additional features, such as larger text buffers (so you can type
  more), backscroll, history of previous commands, macros, and so on. 

  Here is a list of common clients and the anonymous ftp sites at which
  you can get them. To find out how to anonymous ftp, ask your system 
  administrator. Please note that the below sites are subject to change.
  The below are listed solely for your information and possible benefit. 
  The developers of PennMUSH have nothing to do with the clients. 

  OPERATING                   FTP or WWW SITE/
  SYSTEM          CLIENT      DIRECTORY
  -----------------------------------------------------------------------
  UNIX            Tinyfugue   tf.tcp.com
                              /pub/tinyfugue
  WINDOWS 32-bit  MUSHClient  ftp.pennmush.org
                              /pub/PennMUSH/Win32Binaries
                  SimpleMU    http://simplemu.onlineroleplay.com
  MACINTOSH       MUDDweller  http://www.shareware.com (search for Muddweller)

& CONTROL
  Controlling an object basically means that you have the power to change
  the object's characteristics such as flags and attributes. It may also
  mean that you have the ability to destroy it.

  Here are the conditions under which object O controls victim V:
  1. If V is God, O must be God
  2. If V is Wizard, O must be Wizard or God
  3. If O is a Wizard, O controls V
  4. If V is Royalty, O must be Royalty, Wizard or God
  5. If V and O are owned by the same player:
     5a. If V is not TRUST, O controls V
     5b. If V is TRUST, O must be TRUST or the player must be TRUST
  6. If V is on a zone, and isn't a player and isn't TRUST,
     O controls V if O passes the zone-lock of the zone.
  7. If V is owned by a SHARED player, and V isn't a player and isn't set
     TRUST, O controls V if O passes the zone-lock of the SHARED player.

  Step 6 is skipped if config(zone_control_zmp_only) is on.
  There's also one special case: anyone can @link an unlinked exit
  (at which point the exit is @chowned to the linker).

  See also: controls(), TRUST, ZONES, SHARED PLAYERS
& COSTS
  These are usually:
  
          kill: 10 pennies (or more, up to 100 pennies)
          page: 0 pennies
          @dig: 10 pennies
          @create: 10 pennies (or more)
          @find: 100 pennies
          @search: 100 pennies
          @entrances: 100 pennies
          @link: 1 penny (if you  didn't already own it,
                          +1 to the previous owner).
          @open: 1 penny (2 pennies if linked at  the same time)
  
  Type '@config costs' to get the costs for the particular MUSH you are on.

  See also: MONEY, money(), score
& CREDITS
  Maintainer: Javelin
  Developers: Talek [TAP], Trivian [TN], Halatir [LdW], Raevnos [SW]
  Porters: Nick Gammon [NJG] (win32), Dan Williams [DW] (MacOS), 
           Sylvia (OS/2), Ervin Hearn III [EEH] (win32)
  Former devteam: Rhyanna [RLM]
 
  The original TinyMUSH 1.0 code was written by Lawrence Foard, and was
  based upon James Aspnes' TinyMUD server. Since then, the code has been
  modified by the programmers of MicroMUSE (then MicroMUSH), and Joseph
  Traub (Moonchilde of PernMUSH).  From January 1992 to January 1995,
  Lydia Leong (Amberyl of PernMUSH / Polgara of Belgariad) maintained
  the code currently known as PennMUSH 1.50.  From January 1995 on, Alan
  Schwartz (Paul of DuneMUSH / Javelin elsewhere) has been maintaining
  this code, along with a development team.

  Big thanks to the developers of TinyMUSH 2.0, 2.2 [2.2], 3.0 [3], Mux2,
  and Rhost [Rhost] servers, as well as to the players of Belgariad MUSH,
  DuneMUSH, and M*U*S*H, and everyone else using this server!

  See also: help code, help license
& DATABASE
& DBREFS
& DBREF NUMBER
& DBREF #
  You will find the term "dbref" or "dbref number" used frequently in these
  help files and in MUSHcode. It is an abbreviation of "database reference
  number".
  
  The database is the part of MUSH that stores all the information about 
  this particular MUSH. Players, things, rooms, and exits are all objects
  in the database. Each object in the database has a unique dbref number
  that is set when the object is created. You can use the dbref number to
  refer to an object that is not in your current location, and it is 
  especially important for global code.

  Using DBREFs is also faster than using names, even if the object is
  in your location. This is because whenever you try to do something with
  an object (such as look at it, take it, etc.), the MUSH first has to
  locate the object. Since the dbref is unique, it can immediately find
  the object rather than checking through all the contents of your area
  to see if one matches the name.

(continued in help dbref2)
& DBREF2
  
  If you own or control an object, you will see its dbref number listed
  right after its name when you look at it (unless you are set MYOPIC).

  Example:
    > look me
    Cyclonus(#3PWenAMc)
    A very short desc.

  The dbref number is indicated by the number/pound sign (#). Cyclonus's
  dbref is #3. The letters following the dbref are the abbreviations of
  the flags set on the object. NOTE: the abbreviation of the OPAQUE
  flag is 'O' (o), which looks like '0' (zero) on some clients. Make sure 
  you have the right number before using it in your code!

  See also: MYOPIC, OPAQUE, MUSHCODE
& DROP-TOS

  When you use the @link command on a room, it sets another room or
  object as the DROP-TO location. By default, any non-STICKY object that
  someone drops in the room will automatically be transported to the
  drop-to location, rather than staying in the room. Any STICKY object
  droped in the room will go to its home.

  If the room is set STICKY, objects dropped in the room will stay there
  until the last player leaves/disconnects, at which point they will be
  transported as described above.

  If the room has a @lock/dropto set on it, only objects that pass the
  lock will be transported (either immediately or when the last player
  leaves if the room is STICKY). This can be used to prevent the dropto
  from acting on, say, objects containing connected players.

  Drop-tos are useful for keeping rooms uncluttered. 

  See also: @link, STICKY, LINK_OK, @lock
& %#
& %N
& ENACTOR
  The enactor is the object that does something (enacts something :).
  This is an important concept in MUSH, because the way many commands
  work will depend on who enters the command (ie, who the enactor is).
  Any type of object can be an enactor. 

  There are two %-substitutions that involve the enactor: %# and %N. The
  first returns the enactor's dbref # and the second returns the enactor's
  name. If, for example, you have an @osucc on an object that includes the
  %N symbol, whenever someone picks up the object, that %N will be 
  replaced with the name of the enactor (the person who typed 'get <object>'
  in this case). 
  
  See also: EXECUTOR, SUBSTITUTION, DBREF
& EVALUATION ORDER
  Whenever some text is entered by an object or thing, the MUSH program
  attempts to match it against a valid game command in the following 
  order of possible commands:

    Special game commands: WHO, QUIT, etc.
    "home" command
    Single-token commands: ", :, ;, +
    Exits in the room
    @-commands
    Regular game commands: get, inventory, etc.
    Enter aliases
    Leave aliases
    User-defined commands on nearby objects. All such $commands are matched
      and executed.
    If there are no user-defined commands nearby:
      If the zone of the player's location is a zone master room,
        Zone master room exits
        Zone master room user-defined commands
      Else
        User-defined commands on the zone of the player's location

(continued in help evaluation2)
& EVALUATION2
    If still nothing is matched:
      User-defined commands on the player's personal zone
    If nothing, including zone commands, has been matched:
      Global exits
      Global user-defined commands: all $commands in the Master Room are
        matched. Local commands are always checked first and ALWAYS negate
        global commands.

  Note that if something is typed in that results in a "Huh?" all the
  objects in the master room will end up being checked for it. This is
  one of the reasons why having too many global commands can lead to lag.

  Because local commands overrule global commands, you can easily prevent
  a global command from working in a specific room by setting a copy of
  the global command in that room. Alternatively, if a global command is
  oddly not working in a room, you should check for copies of the command
  word in the room (using @scan).
& %!
& EXECUTOR
  The executor of a command is the object actually carrying out the command.
  This differs from the enactor, because the enactor is the object that sets
  off the command. In some cases, the enactor and the executor will be the
  same. There is a %-substitution, %!, that is replaced by the dbref # of
  the executor of the command.

  For example:
    @emit %N is the enactor and %! is the executor!
    > Cyclonus is the enactor and #6 is the executor!
    @create Box
    > Created: Object #10
    &DO_EMIT box=$emit:@emit %N is the enactor and %! is the executor!
    emit
    > Cyclonus is the enactor and #10 is the executor!

  In the first case, Cyclonus directly entered the command and was therefore
  both the enactor and the executor. In the second, Cyclonus set off the 
  command on the box, so Cyclonus was still the enactor, but the box was
  the object that was actually doing the @emit, and was thus the executor.

  See also: ENACTOR, SUBSTITUTION
& EXITS
  An exit is a one-way link that takes you from its source room to its 
  destination room. To open an exit from a room, you must control that room.
  To open an exit to a room, you must either control the room or it must be 
  set LINK_OK. If an exit is set DARK is will not show up in the list of 
  obvious exits in a room.

  If an exit is set TRANSPARENT, someone who looks at the exit will also
  see the description and contents of the destination room. If an exit is 
  set CLOUDY, someone who looks at the exit will also see the contents of 
  the room beyond, but not its description. If an exits is set -both-
  CLOUDY and TRANSPARENT, the description but not the contents will be seen.
   
  If you have code on an exit (In an @asuccess or the like), note that
  [loc(exit)] is the exit's destination, and [home(exit)] is the exit's
  starting point. If an exit @emit's something, it will be heard in the
  source room.
   
(continued in exits2)
& EXITS2
  You can create an exit that sends those who go through it to their homes
  by typing '@link <EXIT>=home'.

  Starting with PennMUSH version 1.50p10, exits can have more than one 
  destination. To make an exit with a variable destination, open the exit 
  (using @open),  then type '@link <EXIT>=variable'. Finally, add an 
  attribute named 'DESTINATION' to the exit (&destination <EXIT>), which 
  will be evaluated for the dbref # of the destination room when the exit 
  is used. 
   
  For example:
  @open South <S>;s;south
  @link s=variable
  &destination s=[switch(rand(3),0,#100,1,#101,2,#102)]
   
  This exit would take you to either room #100, #101, or #102 depending on 
  the random number. 

  Anyone can create variable exits, but the destinations must be to places
  that the exit can normally @link to.

  See also: @link, @open, link_ok, CLOUDY, TRANSPARENT, @firstexit
& FAILURE
  FAILURE  

  A "failure" usually occurs when you try to do something that is 
  governed by an @lock and you don't pass the lock. If you try to
  take a player or thing, and you don't pass their @lock, you will
  set off their @fail/@ofail/@afail attributes. If you try to go
  through an exit, and you don't pass its @lock, you will similarly
  set off its @fail/@ofail/@afail.

  Many other things can also be locked -- see @lock and locktypes for 
  more information. However, there are failure messages at this time
  only for the above, for failing to enter an object 
  (@efail/@oefail/@aefail), and for failing to leave an object
  (@lfail/@lefail/@alfail).

  See also: @lock, @fail, @efail, @lfail
& GENDER
& SEX
  Gender on a MUSH is entirely up to you. You can set yourself (or any
  of your objects) to be male, female, neuter, or plural. If whatever
  is in the SEX attribute is not recognizable, the MUSH will assume 
  the object is neuter. Setting a gender attribute will enable 
  pronoun substitution by the MUSH. The SEX attribute is visual to
  anyone who wants to see it. 

  See also: @sex, SUBSTITUTION
& GLOBALS
& GLOBAL COMMANDS
  A command is "global" if it can be used anywhere in the world of the
  MUSH. The standard MUSH commands are all global, so this term is 
  usually used to refer to user-defined commands on objects in the
  Master Room of the MUSH. Global commands very greatly from MUSH to
  MUSH, but you can usually find MUSH-specific help on them by
  typing "+help". 

  See also: MASTER ROOM, USER-DEFINED COMMANDS, EVALUATION
& HERE
  The word 'here' refers to the room you are in. For example,
  to rename the room  you're in (if you control it), you could enter 
  "@name here= <new name>". 
& HOMES
& HOME
  Every thing or player has a home, which is usually the room where
  it was created. You can reset your home or the home of any object
  you own with the @link command: @link <me|object>=<location>. You
  must also control <location>, unless that location (room or thing)
  is set ABODE or LINK_OK.

  When a player types 'home', s/he is sent back to the home room. When 
  a thing with the STICKY flag set on it is dropped, it also goes to 
  its home location. Note that if the FIXED flag is set on a player, 
  he/she cannot use the 'home' command.

  You can create an exit that sends players home by doing:
        @link <exit name>=home
  You can set the drop-to in a room to home by doing:
        @link <room dbref or "here">=home

  See also: DROP-TOS, @link, STICKY, LINK_OK, FIXED, EXITS
& INTERIORS
  Here's a quick description of how to make things that can be entered:
        
  @create Car
  @desc Car=A shiny red car.
  @idesc car=You are sitting inside a luxurious sportscar.
  @set Car=enter_ok
  @oxleave car=climbs out of the car.   { The 'ox' messages are shown to 
  @oxenter car=climbs into the car.     { those OUTSIDE the object.
  @oenter car=joins you inside the car. { The 'o' messages are shown to 
  @oleave car=gets out of the car.      { those INSIDE the object
  @enter car=You get into the car.      { The plain messages are shown to 
  @leave car=You get out of the car.    { the one entering or leaving 
       
(continued in help interiors2)
& INTERIORS2
  Now, if you want people inside to be able to hear and communicate with 
  the outside, you also need to do the following.
   
  @set car=audible  (lets people outside hear what's being said in the car.
  @listen car=*     (lets people inside hear what's being said outside.
  @prefix car=From inside the car,
  @inprefix car=From outside,
  @filter car=* has arrived.,* has left.,joins you inside the car.,
    gets out of the car.
  @infilter car=* has arrived.,* has left.,* climbs out of the car.,
    * climbs into the car.

  (The filters will keep people on the outside from seeing the 'o'
  messages and people on the inside from seeing the 'ox' messages which
  is a good thing.)

  See also: enter, leave, @prefix, @filter, AUDIBLE, @listen
& LAST & LASTLOGOUT
  LAST and LASTLOGOUT

  These attributes show the last times you connected and disconnected from
  the MUSH.
& LASTSITE
& LASTIP 
  LASTSITE and LASTIP

  The LASTSITE attribute gives the name of the site you last connected from.
  The LASTIP attribute gives the IP address you last connected from.
  Mortals cannot set them.
& LINKING  

  You can link to a room if you control it, or if it is set 
  LINK_OK or ABODE. Being able to link means you can set the homes of
  objects or yourself to that  room if it is set ABODE, and can set 
  the destination of exits to that room if it is LINK_OK.

  See also: LINK_OK, ABODE, @link
& LISTENING
  
  There are two basic ways to trigger action on the MUSH. The basic way
  is to type in commands such as 'look' or '@emit'. These commands are not
  seen or heard by other players, although the results of the commands may
  be.

  The other way is to "listen" for something said/emitted in your hearing.
  There are two ways to listen for something in a room. The easiest way
  is to use a combination of @listen and @ahear/@aahear/@amhear. 

  For example:
    > @listen Welcome Mat=* has arrived.
    > @ahear Welcome Mat="Welcome, %N!
    Breaker has arrived.
    Welcome Mat says, "Welcome, Breaker!"

(continued in help listening2)
& ^
& LISTENING2
  If you need an object to "listen" for more than one pattern, you can
  also use ^-patterns.  These work similar to user-defined commands, 
  using ^ instead of $. An object must be set MONITOR to have ^-patterns
  activated.

  Syntax:  &<attribute> <object> = ^<pattern>:<action list>

  For example:
  > @set Welcome Mat = MONITOR
  > &greet Welcome Mat = ^* has arrived.:"Welcome, %N!
  > &goodbye Welcome Mat = ^* has left.:POSE says as %N leaves, "Bye!"
  Grimlock has arrived.
  Welcome Mat says, "Welcome, Grimlock!"
  Grimlock has left.
  Welcome Mat says as Grimlock leaves, "Bye!"

  Such attributes can also be @triggered as if the ^<pattern>:
  did not exist.

(continued in help listening3)
& LISTENING3
  Please note that an object CANNOT trigger its own ^-patterns, so they
  work like @ahear rather than @aahear or @amhear. (Note that the
  triggering object is whatever happens to be %#, so, for example, when
  you @set an object MONITOR, you are %# with regard to the 
  "Object is now listening" message, and this message can be picked up
  with an ^pattern.)

  Additionally, unlike $-commands, @listen and ^-patterns are NOT
  inherited via @parent, unless the LISTEN_PARENT flag is set on the
  listener.

  Listen patterns are checked after the object's normal @listen attribute.

  See also: @listen, @ahear, @amhear, @aahear, MONITOR, 
          USER-DEFINED COMMANDS, LISTEN_PARENT

& LISTS
  The word "list" is used in the help files to refer to a string that
  is a series of smaller strings separated by one or more spaces. A list
  can also have its elements separated by some other kind of character --
  the separating character is called the "delimiter". 
  For example, the following are all lists:

    #6 #10 #14 #12
    Rumble|Krystal|Bobatron|Rodimus Prime   ('|' is the delimiter here)
    foo bar whee blarg 
    -eek- .boing. yawp #5 7
  
  Lots of MUSHCode depends on lists and manipulating them. Normally, a list
  is made up of similar items (so the fourth list in the example is NOT a 
  typical one).

  See also: STRINGS, List Functions
& LOOPING
  Looping in an object can have its good parts and its bad parts.
  The good part is when you activate part of a program multiple times
  to exhaustively perform an operation.  This can be done like this:

    &PART1 object=<action list> ; @trigger me/PART2
    &PART2 object= @select <test for being done>=<false>,@trigger me/PART1

  Looping can be a problem when it goes on without stopping.  The @ps
  command can be used to see if you are looping.  Beware!  A looping
  machine that isn't @halt'd will drain your pennies while you are away
  from the mush!

  See also: @ps, HALT, COSTS, @trigger
& MASTER ROOM
  
  The Master Room enables global commands and exits. Exits in the Master
  Room may be used from any location on the MUSH. All objects left in the
  Master Room are checked for user-defined $commands. Those $commands are
  considered global, meaning that they can be used anywhere on the MUSH. 
  Normally, only wizards will have access to the Master Room; if you have
  a global command that you would like to see enabled for the MUSH, speak
  to a wizard.
  
  See also: EVALUATION, GLOBAL COMMANDS
& ME
  The word 'me' refers to yourself. Some things to do when 
  starting out: 
  1) give  yourself a description:      @desc me=<description>
  2) check your desc.:                  look me
  3) lock yourself:                     @lock me==me
  4) set your gender:                   @sex me=<male|female|neuter|plural>

  See also: help newbie, help @lock, help @describe, help @sex
& MONEY
  The MUSH has a built-in money system, which gives a starting amount
  of money to new players and hands out a daily allowance thereafter.
  MUSH money (the default name is "pennies", but this may be different
  depending on the particular MUSH) is spent on some MUSH commands
  that are computationally expensive or alter the database. In 
  addition, every time you "queue" a command, it costs you a certain
  amount of money -- this prevents looping from getting out of control,
  since when all your money is spent, you can't queue any more commands.

  The money system can also be used on player-created objects by giving 
  them @cost/@payment/@opayment/@apayment attributes. When someone then
  pays the object by giving it the right number of pennies, the attributes
  are triggered.

  See also: COSTS, give, @cost, @pay, @opay, @apay
& MUSHCODE
& SOFTCODE

  MUSHcode is the programming language available within the MUSH itself
  with which you can create user-defined commands and macros.  It is 
  sometimes called "softcode" to distinguish it from "hardcode", which is 
  the language that the source code for the MUSH server is written 
  in. (Incidentally, hardcode is written in the C programming language.)
  
  At its most basic, writing MUSHcode is just stringing together a series
  of commands that you would otherwise just type in one at a time.  You
  can store MUSHcode in attributes on any type of object you own or control
  (including yourself!).  The series of commands can be triggered by using 
  a user-defined command or by using @trigger.
  
(continued in help mushcode2)
& MUSHCODE2

  If you would like to learn more about mushcoding and how to create macros
  for yourself, the following help files may be useful.  However, the best
  way to learn is by obtaining a copy of Amberyl's MUSH manual and following
  the examples described there.  The manual is available by anonymous FTP
  from: ftp.pennmush.org in the directory /pub/PennMUSH/Manuals

  Related Help Topics (in no particular order)
  -------------------
  ATTRIBUTES    SUBSTITUTION    NON-STANDARD ATTRIBUTES 
  ENACTOR       EXECUTOR        USER-DEFINED COMMANDS
  DBREFS        EVALUATION      TYPES OF OBJECTS
  WILDCARDS     STRINGS         LISTS           
  ACTION LISTS

& NON-STANDARD ATTRIBUTES
  While there are many standard attributes in MUSH, objects can also have
  an unlimited number of attributes, with any name you wish to use. In the
  past, you were limited to attributes named VA-VZ, WA-WZ, XA-XZ; these
  are still available as standard attributes. However, it is strongly
  recommended that you use non-standard attributes and meaningful names
  in order to make maintaining your MUSHCode easier.

  To set a non-standard attribute, you can use these formats:
      &<attribute name> <obj> = <value>  OR
      @_<attribute_name> <obj> = <value> OR
      @set <obj> = <attribute_name>:<value>

  You can get the value of attributes using the functions v(), get(), and
  xget(). You can evaluate attributes using u(), eval(), and get_eval().
  All attributes can be used in attribute locks and can be 'owned' 
  independent of object ownership. 
  
  See also: ATTRIBUTES, ATTRIB-OWNERSHIP, Attribute Functions
& PARENT
& PARENTS
& OBJECT PARENTS
  
  Objects may have "parent" objects, from which they can inherit attributes.
  Once an object is given a parent, it may use the attributes on the parent
  just as if the attributes were on the object itself, including checking for
  $commands. Use the @parent command to change the parent of an object.

  Objects may have multiple levels of parents - thus, if #100 is the
  parent of #101, which is the parent of #102, object #102 checks itself,
  #101, and #100 for attributes. Attributes are checked on the object
  itself first, followed by its parent, followed by that parent's parent,
  and so forth. There is a (configurable) maximum number of ancestors
  an object may have; the default is 10.
   
(continued in help parents2) 
& PARENTS2
 
  Note that the only properties inherited are attributes. In particular,
  flags and exits are NOT inherited from the parent object. Also, commands
  which walk the attribute list (such as "examine", the LATTR() function,
  the HASATTR() function, @set, and @edit) only affect attributes that are 
  on the object itself.
 
  There are some limitations to the use of @parent. The most important is
  that ^-pattern checking is not done on the parent of an object, unless the
  object is set LISTEN_PARENT. For the purposes of automated game checks, 
  the following attributes are not inherited: CHARGES, EALIAS, LALIAS, LAST, 
  LASTSITE, LISTEN, QUEUE, RQUOTA, SEMAPHORE, and STARTUP. 
    
  The attributes inherited from the parent are treated just like its
  own attributes by the child. Thus, when a $-command or @trigger is
  executed, "me", for example, refers to the child, not the parent,
  and the $-command's associated actions are performed by the child.
  However, uselocks are checked on parents. Failing one stops looking
  for a matching command on that parent chain.

(continued in help parents3)
& PARENTS3
  Attributes with $-commands _are_ inherited from the parent and
  previous generations. Conflicts are resolved not by the $-command 
  name, but by the attribute name. If two attributes are in "conflict", 
  the child's attribute is used.

  For example:

  > &TEST #10=$test:@emit I'm the parent
  > &TEST #11=$check:@emit I'm the child
  > @parent #11=#10
  > test
  (nothing happens)
  > check
  I'm the child

(continued in help parents4)
& PARENTS4
  If a parent has the same $-command name in a different attribute, however,
  BOTH the parent and child commands will execute:

(continued from previous example)
  > &CHECK #10=$check:@emit No, I'm the parent!

  > check
  I'm the child
  No, I'm the parent!
 
  @parent is most useful when several objects use common attributes.
  It is slightly faster to have $commands on the child object which
  in turn @trigger or otherwise retrieve attributes inherited from
  the parent object, rather than having the $commands checked on the
  parent object.

(continued in help parents5)
& PARENTS5
 
  Parent-object $-command checking is at its most efficient when there
  are few or no attributes on the child. Also, each additional level
  of parents further reduces efficiency.
 
  If you are "mass-marketing" your objects, you can create blank copies, 
  and @parent those copies to a template object. You can then customize 
  necessary attributes on the copy. When a buyer @chowns his copy, the 
  parent does not change, so unless you're putting data into the parent 
  that you want to make impossible to read, it's safe to allow the
  purchasers of your object to @chown their copy.

  See also: @parent, $-COMMANDS, ATTRIBUTES
& POWERS LIST
  Powers can be granted only by wizards, using the @power command. 
  Powers cannot be granted to guest characters or players who are set
  UNREGISTERED. Powers normally give the player the ability to use a 
  limited set of wizard/admin powers.

  announce              Can use @wall command.  
  boot                  Can use @boot command.
  builder               Can use Builder commands.
  chat_privs            Can use Admin channels.
  functions             Can use @function command.
  guest                 Guest. Restricted command set.
  halt                  Can @halt others' objects and do @allhalt.
  hide                  Can hide on the WHO list.
  idle                  No inactivity timeout.
  link_anywhere         Can @link an exit to anyplace.
  login                 Not subject to login restrictions.
  long_fingers          Can do things remotely, like "get".

(continued in help powers2)
& POWERS2
& POWERS LIST2
  no_pay                Doesn't need money for anything
  no_quota              Has an unlimited quota
  open_anywhere         Can @open a link from any room.
  pemit_all             Can @pemit to HAVEN/ulocked players.
  poll                  Can use @poll command.
  player_create         Can use @pcreate command.
  queue                 Has queue limit equal to the size of the database.
  quota                 Can use @quota commands on other players.
  search                Can do @search, @stats, and @entrances on anything.
  see_all               Sees everything as if it were Visual.
  see_queue             Can do @ps on anyone, and @ps/all.
  tport_anything        Can @teleport anything.
  tport_anywhere        Can @teleport to anywhere.
  unkillable            Can not be killed

  See also: @power
& PUPPETS
  A thing is turned into a puppet by setting the PUPPET flag on it.
  A puppet object is an extension of its owner and relays everything
  it sees and hears to its owner, except if it is in the same room as
  the owner (a puppet with the VERBOSE flag will relay even if it's in
  the same room). Things relayed by the puppet will be prefixed by the 
  name of the puppet.

  Puppets are useful for keeping track of what is going on in two
  rooms at once, as extensions of a player (such as a pet, for example),
  or for testing code. 

  You can control your puppets using the @force command. It is important
  to remember the DBREF numbers of your puppets so you can control them
  even if they are not in the same room with you. You can also have
  your puppets follow you by using the 'follow' command.

(example in help puppets2)
& PUPPETS2
  An example of a puppet:

  > @create Punch
  Created: Object #18.
  > drop Punch
  Dropped.
  > @set punch=puppet
  Punch is now listening.
  Flag set.
  > @force punch=go north
  Punch has left.
  Punch> The Finishing Place
  Punch> 
  Punch> Obvious exits:
  Punch> Door <S>  
  #18 :waves hello
  Punch> Punch waves hello

  See also: PUPPET, @force, DBREF
& QUEUE
  QUEUE

  The queue is the waiting line for commands to be executed by the MUSH.
  Each time you enter a command, it goes into the queue and stays there
  until its turn comes up, at which time the MUSH processes the command
  and you see the results. The MUSH can execute several commands every
  second, so normally you see results right away. However, if there are
  too many commands in the queue, there may be a delay, called lag. The
  more common cause of lag, however, is network delays between you and
  the MUSH.

  The QUEUE attribute is only visible to objects that control you 
  (wizards, you, and your objects) or unless you are VISUAL.  It 
  tracks how many active commands you have in the queue.

  See also: @ps, LOOPING
& REGEXP
& REGEXPS
  (This help text is largely from TinyMUSH 2.2.4, with permission)

  The majority of matching in MUSH is done with wildcard ("globbing")
  patterns. There is a second type of matching, using regular expressions,
  that is available in certain circumstances.
 
  For attributes that are $-commands or ^-listen-patterns, setting that
  attribute "regexp" (with '@set <object>/<attribute>=regexp') causes
  patterns to be matched using regular expressions rather than
  globbing. In addition, the function regmatch() performs regular
  expression matching.
 
  In a regular expression match, the substring of the string which matched
  the regexp pattern is %0; %1 through %9 are the substrings of the string
  which matched parenthesized expressions within the regexp pattern. 
 
  Continued in 'help regexps2'.
& REGEXPS2
  Regular expressions are extremely useful when you want to enforce
  a data type. For example, if you have a command where you want a
  player to enter a string and a number ('+setnum <player>=<number>',
  for example), you might do it like this:
 
  &DO_NUM Command Object=$^\+setnum (.+)=([0-9]+)$: @va me=Data: %1 = %2
  @set Command Object/DO_NUM = regexp
 
  Then, '+setnum cookies=30' would set VA to "Data: cookies = 30".
  This eliminates your having to check to see if the player entered
  a number, since the regular expression matches only numbers.
  Furthermore, the '+' guarantees that there needs to be at least
  one character there, so a player can't enter '+setnum cookies='
  or '+setnum =10' or similarly malformed input.
 
  The '+' sign in the command has to be escaped out, or it is taken as
  a regexp token. Furthermore, the pattern-match has to be anchored
  with ^ and $, or something like 'try +setnum cookies=30 now' would
  also match. Regexps are case-sensitive; wildcard globbing is not.
 
  Regular expression syntax is explained in 'help regexp syntax'.
& REGEXP SYNTAX
  PennMUSH uses PCRE for its regular expression engine.  PCRE is an
  open source library of functions to support regular expressions whose
  syntax and semantics are as close as possible to those of the Perl
  5 language.  The text below is excerpted from its man page. PCRE
  was written by Philip Hazel <ph10@cam.ac.uk>, and is Copyright (c)
  1997-1999 University of Cambridge, England. You can find it at
     ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/

  (Note that in PennMUSH, if the regular expression is in an eval'd
  context (like an argument to regmatch), you'll have to do a lot
  of escaping to make things work right. One way to escape an argument
  like %0 is: regeditall(%0,\\W,\\$0) or similar).

  A regular expression is a pattern that is matched against a subject
  string from left to right. Most characters stand for themselves in a
  pattern, and match the corresponding characters in the subject. 

 (Cont'd in help regexp syntax2)
& regexp syntax2
  There are two different sets of meta-characters: those  that
  are  recognized anywhere in the pattern except within square
  brackets, and those that are recognized in square  brackets.
  Outside square brackets, the meta-characters are as follows:

       \      general escape character with several uses
       ^      assert start of subject
       $      assert end of subject
       .      match any character except newline
       [      start character class definition
       |      start of alternative branch ("or")
       (      start subpattern
       )      end subpattern
       ?      0 or 1 quantifier (after a unit to quantify)
              or, minimal match (after a quantifier)
              or,  extends the meaning of ( after a ( 
       *      0 or more quantifier
       +      1 or more quantifier

  (Cont'd in help regexp syntax3)
& regexp syntax3
  Part of a pattern that is in square  brackets  is  called  a
  "character class". It matches any character listed in the class.
  In a character class, the only metacharacters are:

       \      general escape character
       ^      negate the class, if the first character in the class
       -      indicates character range (e.g. A-Z, 0-4)
   [:NAME:]   A symbol for a group of characters that can vary 
              according to the language the mush is using.
              See 'help regexp classes' for more information.
       ]      terminates the character class

  A backslash will escape most metacharacters, and can turn
  some normal characters into generic character types:

       \d     any decimal digit
       \D     any character that is not a decimal digit
       \s     any whitespace character
       \S     any character that is not a whitespace character
       \w     any "word" character (letter, digit, or underscore)
       \W     any "non-word" character
 
  (Cont'd in help regexp syntax4)
& regexp syntax4
  A backlash can also two useful assertions -- conditions that
  must be met at a particular point in a match:

       \b     word boundary
       \B     not a word boundary

  A word boundary is a position in the  subject  string  where the
  current character and the previous character do not both match \w or
  \W (i.e. one matches \w and  the  other  matches \W),  or the start
  or end of the string if the first or last character matches \w,
  respectively.

  (Cont'd in help regexp syntax5)
& regexp syntax5
  Quantifiers specify repetition of characters. Three are available:
       *    match 0 or more of whatever came before
       +    match 1 or more of whatever came before
       ?    match 0 or 1 of whatever came before

  (In theory, you can match m-n of whatever came before with {m,n},
  but the MUSH parser makes it difficult to use {}'s in functions unless
  you store the regex pattern in an attribute and use v() to fetch it)

  Quantifiers are usually greedy -- they match as much as possible.
  Adding a ? after a quantifier causes it to match as little as
  possible instead. 

  (Cont'd in help regexp syntax6)
& regexp syntax6
  Outside a character class, a backslash followed by  a  digit greater
  than  0  (and  possibly  further  digits) is a back reference to a
  capturing subpattern  earlier  (i.e.  to  its left)  in  the  pattern,
  provided there have been that many previous capturing left parentheses.
  A back reference matches whatever actually matched the  capturing
  subpattern in the current subject string, rather than anything matching
  the subpattern itself. So the pattern

    (sens|respons)e and \1ibility

  matches "sense and sensibility" and "response and  responsibility",  but
  not  "sense  and  responsibility". 

  (Cont'd in help regexp syntax7)
& regexp syntax7
  An assertion is  a  test  on  the  characters  following  or
  preceding  the current matching point that does not actually consume
  any characters.  There  are  two kinds:  those that look ahead of the
  current position in the subject string, and those that look behind it.

  An assertion subpattern is matched in the normal way, except that  it
  does not cause the current matching position to be changed. Lookahead
  assertions start with  (?=  for  positive assertions and (?! for
  negative assertions. For example, Lookbehind assertions start with
  (?<=  for  positive  assertions and (?<! for negative assertions.

  Assertion subpatterns are not capturing subpatterns, and may not
  be  repeated,  because  it makes no sense to assert the same thing
  several times. If an assertion contains capturing subpatterns within it,
  these are always counted for the purposes of numbering the capturing
  subpatterns  in  the  whole pattern.

  (Cont'd in help regexp syntax8)
& regexp syntax8

  PCRE's engine can also do conditional subpattern matching,
  embedded comments in regexps, and a bunch of other things.
  See a regexp book for details.
& REGEXP CLASSES
  In a character class, you can use a number of additional keywords 
  that match certain types of characters. The keywords are enclosed in
  [: and :], within the character class, so the whole thing looks like
  [[:NAME:]].

  These keywords can be mixed with other things in the character class,
  like [ab[:digit:]], which will match 'a, 'b', or a digit. [:^NAME:]
  reverses the meaning of NAME - it expands to everything but characters
  that would match [:NAME:].

  Some recognized NAMEs:
   digit, for numbers. [[:digit:]] is the same as \d.
    [[:^digit:]] is the same as \D.
   alpha, for letters. alnum, for numbers and letters.
   lower, for lower-case letters. upper, for upper-case letters.
   word, for word characters. [[:word:]] is the same as \w.
    [[:^word:]] is the same as \W.
   space, for whitespace characters. [[:space:]] is the same as \s.
    [[:^space:]] is the same as \S.

Continued in 'help regexp classes2'
& REGEXP CLASSES2
 These keywords (Or the corresponding \codes) should be used instead of
 explicit ranges where possible to improve portability. For example,
 [A-Za-z] and [[:alpha:]] are not the same thing in languages with accented
 characters. There are other keywords, but the ones listed are the most
 useful.

  Examples:
  > say regmatch(foo_bar, lit(^[[:word:]]+$))
  You say "1"
  > say regmatch(foo bar, lit(^[[:word:]]+$))
  You say "0"  

& REGEXP EXAMPLES
  Topic: REGEXP EXAMPLES
 
  The regexp pattern '.' is equivalent to the wildcard '?'; it matches
  one and only one of an arbitrary character.
 
  The regexp pattern '.+' is equivalent to the wildcard '*'; it matches
  one or more arbitrary characters. To match zero or more arbitrary
  characters, the regexp pattern is '.*'.
 
  To match a string of numbers, use:       [0-9]+    or \d+
  To match a string of letters only, use:  [A-Za-z]+ or \w+
 
  See 'help regexp syntax' for a more detailed explanation.

& REGISTERS
  A register is essentially a little reserved piece of computer memory
  that can hold some variable information that you want to pass on to
  another command.  There are ten registers on the MUSH available via
  %-substitution (%0 - %9) and thirty-six setq registers available via
  %q- substitution (%q0 - %q9 and %qA - %qZ). 

  The basic registers are filled with information that matches the 
  wildcard pattern of the command trigger. (Before you say "Huh?", here's
  an example.)

  &COMMAND me=$command *+*:@emit %0 is in register 0 and %1 is in register 1.
  > command whee+blert foo
  whee is in register 0 and blert foo is in register 1.

(continued in help registers2)
& REGISTERS2
  As you can see from the above example, the command trigger had two wildcards
  separated by a "+" sign. When the user types in the command with some words
  taking the place of the wildcards, the first register (register 0) is filled
  with whatever part of the command replaces the first wildcard (in this case,
  "whee") and the second register is filled with whatever replaces the second
  ("blert foo").  

  They can also be filled with information that is passed by an @trigger 
  command:

  &SOMECODE me=@emit %0 is in register 0 and %1 is in register 1.
  @trigger me/somecode=whee,foo bar
  > whee is in register 0 and foo bar is in register 1.

  The registers can also be accessed using the V-function (v(0) through v(9)).

  Please see help setq() for more information about the setq registers.

  See also: SUBSTITUTIONS, @trigger, USER-DEFINED COMMANDS, setq()
& RQUOTA
  RQUOTA

  This attribute tracks remaining building quota if it is implemented.  
  It is settable in-game only by a wizard, and is only visible to wizards.

  See also: @quota, @squota
& SEMAPHORES
  The most complicated thing about semaphores is their name. Before you try
  to use semaphores, you should first be familiar with the "@wait" command.
  If you are, then you know that normally, you type:

    @wait <number of seconds>=<action> 

  and the action takes place after that number of seconds has passed. With
  a semaphore, you instead type:

    @wait <object>=<action>
    @wait <object>/<number of seconds before timeout>=<action>

  and the action takes place after the object has been "notified" that its
  time for it to happen. You can also set a timeout -- if the object hasn't
  been notified by the time that number of seconds has passed, the action
  will take place. Any object (player, thing, exit, room) that you control 
  or that is set LINK_OK can be used to wait actions on.

(continued in help semaphores2)
& SEMAPHORES2

  An object is notified using the "@notify" command.  When you type "@wait
  <object>=<action>", you are adding one to the SEMAPHORE attribute on the
  object. When you type "@notify <object>", you are decreasing the SEMAPHORE
  attribute on the object by one. Whenever the attribute decreases, one of
  the actions waiting on the object takes place. The actions occur in the
  order they were added. 

  You can make the semaphore attribute of an object negative by @notify-ing
  it more times than things have been @wait-ed on it. If you do so, anything
  @wait-ed on the object will add one to the SEMAPHORE attribute and the
  action will take place immediately. You can also make all the actions
  waiting on an object take place right away by using "@notify/all", or 
  wipe all the commands out and clear the SEMAPHORE attribute by using
  "@drain". Please note that all SEMAPHORE attributes are cleared out 
  whenever the MUSH is restarted.
 
  Semaphores can be used to make sure that events occur in the right order,
  or to make sure that two players can't use the same object at the same
  time. 

(continued in help semaphores3)
& SEMAPHORES3

  It's important to remember that the actions will be carried out NOT by
  the object that they are being @waited on, but by whichever object
  entered the @wait.

  Examples:
  
  > @wait semaphore=:tests.
  > @notify semaphore
  Wizard tests.
  
  > @wait timer/30=:waits 30 seconds.
  [ 30 seconds passes. ]
  Wizard waits 30 seconds.
 
  See also: @wait, @drain, @notify
(continued in help semaphores4)
& SEMAPHORES4
  Semaphores can be used to enforce mutual exclusion - to prevent
  the same object from being used simultaneously by two players.
  The basic strategy is to ensure that the object always has a
  SEMAPHORE of -1, to enclose commands in an @wait, and to
  conclude the set of commands with an @notify me:

  > &doit obj = $doit: @wait me={&doer me = %N; @tr me/report}
  > &report obj = "[v(doer)] did it!; @notify me
  > @startup obj = @drain me; @notify me
  > @notify obj
  > ex obj/SEMAPHORE
  SEMAPHORE [#1ic+]: -1
  > doit
  obj says "Talek did it!
  > ex obj/SEMAPHORE
  SEMAPHORE [#1ic+]: -1

  If a second player types doit as well, the second player's command
  is put on the semaphore queue and not run until the @notify me at
  the end of the REPORT attribute. Note the STARTUP attribute -
  because semaphores are cleared when the MUSH starts up, you must
  insure that the object gets @notify'd once when it starts up.
(Continued in help semaphores5)
& SEMAPHORES5
 Normally, semaphores use the SEMAPHORE attribute. However, other
 attributes can be used, as long as they follow a few simple rules:
 If the attribute is already set, it has to have the same owner (God)
 and flags as the SEMAPHORE attribute would (typically no_inherit, no_clone,
 and locked - see help @set and @atrlock), and have a numeric or empty
 value. If it's not set, it can't be one of the built in attributes
 (See @list attribs) unless, naturally, it is SEMAPHORE.

 See the help on @wait, @notify and @drain for details, but, briefly,
 you can use named semaphores with <object>/<attribute> where you would
 normally just use <object> in those commands. This means you can't have
 a un-timed semaphore on an attribute with a numeric name.

(Continued in help semaphores6)
& SEMAPHORES6
 An example:
 
  > @wait me/semtest=think blah
  > ex me/semtest 
  SEMTEST [#1ic+]: 1
  > @ps
  ...
  Semaphore Queue:
  [#8/SEMTEST]Raevnos(#8P):think blah
  ...
  > @notify me/semtest
  Notified.
  blah

 This allows you to use one object to control many different things -- for 
 example, fights in a turn-based combat sytem.
& SETTING-ATTRIBUTES
  
  Standard attributes are set using @<attrib> <obj>=<value>
  Nonstandard attributes are set using &<attrib> <obj>=<value> 
  Attributes may also be set using @set <obj>=<attrib>:<value>
  
  Attributes are cleared using @<attrib> <obj> or &<attrib> <obj>
  or with @wipe.
  
  Note that there is a difference between clearing an attribute
  and setting an attribute to a null value:
    @va me       <--- wipes out my VA attribute
    @va me=      <--- sets my VA attribute to be empty
  
  Empty attributes retain their flags and atrlock status. Wiped attributes
  are gone forever.
  
  See also ATTRIBUTES, NON-STANDARD ATTRIBUTES, @set, @wipe
& SPOOFING
  Spoofing is the act of making other characters think that a person
  said or did something that they did not.  This is very easy to
  accomplish, and has some good effects, which is why it is allowed.
  However, abusing it is very twinkish and will most likely get you in
  hot water with your wizards. Note that if you are being spoofed and
  want to know who is doing it, you can set yourself NOSPOOF and you will
  be notified who is making the @emits.

  See also: @emit, @pemit, @remit, @oemit, and NOSPOOF.
& STACK
  For those unfamiliar with the term stack, it refers to a programming
  data structure that follows a LIFO (Last-In-First-Out) principle. The
  stack in MUSH holds the ten REGISTERS, which can be accessed via the 
  V-function (v(0) through v(9)) or via %-substitution (%0 through %9).
  
  See also: REGISTERS
& STRINGS
  A string is simply a bunch of characters.  A word is a string that begins
  and ends with the space character.  A sentence is a string made up of 
  smaller substrings that are words.  Please note that a "word" or "sentence"
  in this technical sense does not have to make sense in English (or in any
  other language, for that matter). As far as mush functions and commands
  are concerned, this is a perfectly good sentence:

        Foozle 09blert bar baz foo.

  See also: string functions
& %
& SUBSTITUTIONS
  The % symbol is used in MUSH commands to indicate a substitution -- some
  other character(s) or words are substituted for whatever follows the % 
  symbol. Some common substitutions are:

     %B = a single space (just like [space(1)])
     %R = a blank line
     %T = A tab. Note that this may not look right on some screens.
     %N = name of the ENACTOR (object that set off the command)
     %# = the ENACTOR's database reference number
     
(continued in help SUBSTITUTIONS2)
& SUBSTITUTIONS2
  If the ENACTOR's gender is set, you can use these substitutions to get the
  right pronoun for him/her:
     %s = subjective pronoun: he, she, it, they
     %o = objective pronoun: him, her, it, them
     %p = possessive pronoun: his, her, its, their
     %a = absolute possessive: his, hers, its, theirs.

    Case makes a difference: %S will return He, She, It, They. If you need
    an actual % symbol, use %% to get it.

  Some attributes can be retrieved via substitutions:
     %va-%vz = the contents of the object's VA-VZ attributes, respectively
     %wa-%wz, %xa-%xz = as above, for WA-WZ and XA-XZ

(continued in help substitutions3)
& SUBSTITUTIONS3
  Other substitutions:
     %0-%9   = the contents of the REGISTERS 0-9, respectively
     %@ = the caller's dbref number. Initially same as %#, changes when 
          something like a U-FUNCTION is called.
     %! = the dbref number of the object the command is on.
     %L = the dbref of the ENACTOR's location.
     %c = text of the last command, _before_ evaluation.
     %? = The current function invocation and depth counts.
    %qN = the equivalent of r(N), a register set by a setq() function.
 
(continued in help substitutions4)
& SUBSTITUTIONS4
  Example: 

  @sex me=male
  @drop box=%N just dropped %p box.
  drop box
  > Cyclonus just dropped his box.
 
 Let's say that Cyclonus's dbref number is #10 and the box's dbref
 number is #11. The dbref # of the room Cyclonus is standing in is
 #13.  When Cyclonus dropped the box above, these were the values of
 the following %-variables:
    
  %N = Cyclonus
  %# = #10
  %@ = #10
  %! = #11
  %L = #13

  See also: EVALUATION, ENACTOR, EXECUTOR, DBREFS, v()
& SUCCESS
  A "success" normally occurs when you attempt to do something that is
  restricted by an @lock and you pass the @lock. (Note that if no lock
  is set, you automatically pass it.) For example, the "basic" lock
  restricts who can pick up a player/thing or who can go through an
  exit. Whenever you successfully do either of these things, you will
  set off the basic success messages on the object whose lock you have
  just successfully passed.

  Many other actions can also be locked -- see @lock and locktypes for 
  more information. Many of these actions have standard attributes that
  you can set messages in for when someone succeeds.

  See also: FAILURE, @lock, VERBS, ATTRIBUTES, @success, @asuccess, @osuccess
& SWITCHES
  SWITCHES
 
  Commands can have "switches" which modify the behavior of the
  command. Switches are attached after the end of a command.
  For example, most people are familiar with the command

    @lock me=me

  The "enter" switch to @lock allows you to lock who can enter:

    @lock/enter me=me

  A command may have multiple switches:

    @pemit/noeval/silent me=Hi!

  Help on the switches available for a command is available in the help
  file for that command.
  (If you are looking for information on @switch, see help @switch instead.)
& TYPES OF OBJECTS
  
  Everything on a MUSH is an object in the MUSH database. There are four
  types of objects: players, rooms, exits, things. The first three are
  separated from each other by being set with a special FLAG: Player,
  Room, Exit. Any object that doesn't have one of these flags is a thing.

  Unique Characteristics
  PLAYERS
    Can own other objects and can be connected to. Can receive @mail.
    Can move around, speak/pose/emit, enter MUSH commands, enter global
    commands. You can have $-commands and ^-patterns on a player.
    Players can be carried, can carry other objects, and can follow.
  ROOMS
    Fixed container objects, linked together by exits. Cannot move.
    Rooms can @emit and enter MUSH commands, but they cannot execute
    global commands. You can have $-commands and ^-patterns on a room.
    
(continued in help TYPES2)
& TYPES2
  EXITS
    Objects that link rooms and things together. Cannot move, but can
    be @teleport-ed to a new location. Exits can @emit and enter MUSH
    commands, but they cannot execute global commands. You can NOT 
    have $-commands and ^-patterns on exits. Exits can lead TO things,
    but they can only lead FROM rooms. 
  THINGS
    Can move around, speak/pose/emit, enter MUSH commands, enter global
    commands. Can send @mail as themselves. You can have $-commands and 
    ^-patterns on things. Things can carry, be carried, and can follow.

  See also: EXITS, USER-DEFINED COMMANDS, LISTENING, GLOBALS
& $-COMMANDS
& MACROS
& USER-DEFINED COMMANDS
  User-defined commands can be created by setting $-commands on players, 
  things, and rooms. Exits cannot have $-commands. To set a $-command:

    &<attribute> <object>=$<command name>:<action list>
  
  Whenever someone in the same room as the object types the command
  name, the action list is carried out by the object, as long as:

  - the person typing the command passes the object's uselock
  - the object is not set NO_COMMAND or HALT

  Such attributes can also be @triggered as if the $<command name>:
  did not exist.

  It is recommended that <command name> not begin with "@", as the
  command parser treats @ specially and may cause your command to fail
  if the name might also match an attribute name. Conventionally,
  global commands are often named with the "+" prefix.
  
(continued in help user-defined2)
& $-COMMANDS2
& MACROS2
& USER-DEFINED2
  Any number of *'s and ?'s may be in the command name. A * matches
  any number of characters, and a ? matches any single character.  When
  the actions are executed, the values on the stack in %0-%9 are the
  portions of what the user types that match the first ten *'s or ?'s.
  You can also match a regular expression rather than wildcards.
  See 'help regexps' for details.

  For example, to make a 'wave' command, you could do the following:
    &DO_WAVE me=$wave *:pose {waves to %0.}
  You could then type:
        > wave Guest
        Rhyanna waves to Guest.

  *BE SURE TO @LOCK/USE ME==ME IF YOU SET MACROS ON YOURSELF!*

  See also: STACK, SUBSTITUTIONS, @lock
& VERBS
  For most verbs there are three forms: Verb (what the Enactor sees),
  Overb (what others in the area see) and Averb (the action to be 
  taken when the event happens). Example: @Drop, @Odrop and @Adrop
& WARNINGS

  If the building warning system has been enabled in the source code,
  players may receive regular warnings about potential building problems
  on objects that they own, and will be able to check individual objects
  for warnings.

  For more information, see the following help topics:
    @warnings        @wcheck         NO_WARN         warnings list
    
& WARNINGS LIST
  The building warning system, if enabled, supports the following
  types of warnings:

  exit-unlinked         Warn on unlinked exits
  exit-oneway           Warn on exits with no return exit
  exit-multiple         Warn on multiple exits from A to B
  exit-msgs             Warn on missing succ/osucc/odrop/fail
  exit-desc             Warn on missing description
  room-desc             Warn on missing description
  thing-msgs            Warn on missing succ/osucc/odrop/fail
  thing-desc            Warn on missing description
  my-desc               Warn on missing player description
  lock-checks           Warn on @lock problems

(continued in help warnings list2)
& WARNINGS LIST2
  These warnings combine the functionality of multiple warnings above:

  serious               exit-unlinked, thing-desc, room-desc, my-desc,
                        lock-checks
  normal                serious, exit-oneway, exit-multiple, exit-msgs
  extra                 normal, thing-msgs
  all                   all of the above

  The warning "none" indicates no warnings.
  You can exclude warnings from a larger list by using !<warning>
  after the larger list. For example: @warnings me=all !exit-oneway
& WILDCARDS
  PennMUSH has two standard wildcards in user-defined commands:
  an asterisk (*) matches any string, and a question mark (?) matches
  a single character.  For example, let's say that you want a command
  called "supercalifragalisticexpealidocious" (don't ask me why), but you
  don't want to force people to type the whole thing to trigger the command.
  You could use a wildcard in the command trigger to match substrings of it:

  &TOO_LONG_CMD object=$supercali*:@emit whee
  super
  > (nothing happens)
  supercali
  > whee
  supercalifra
  > whee
  supercalifragalisticexpealidocious
  > whee
  supercalifoobert
  > whee

  A backslash (\) can be used to escape * and ? if you want to match 
  a literal asterisk or question mark.
  See also: USER-DEFINED COMMANDS, REGEXP
& ZONE MASTER ROOMS
& ZMR
  
  Zone master rooms are a subset of zones. If a room is used as a zone
  master, it is a zone master room (ZMR). ZMRs are like local "master"
  rooms. Exits in the ZMR are global to that zone, and $commands on
  objects in the ZMR are global to that zone. Zone master rooms are
  only defined if globals are used.  Zone master rooms are best used for
  very large zones which have a lot of global exits, or for zones with
  restricted commands that can go on a separate use-locked object from
  general ones.

  See also: ZONES, MASTER ROOM, EVALUATION
& ZONE MASTERS
& ZMP
& SHARED PLAYERS
  SHARED PLAYERS
 
  Shared players are player objects which are used to mediate shared
  control of objects. A shared player is an object of type PLAYER which
  has the SHARED flag set. They are created like ordinary players, and
  can connect, build, etc.  The only difference is that objects owned by
  a shared player are controlled by anything that passes the @lock/zone
  of the shared player. 
  
  Anyone who passes the @lock/zone of the shared player can @chown objects
  to it. This, however, does not refund the original creator's money or
  quota, as does normal.

  Shared players used to be known as Zone Masters.  The term was changed
  to emphasize the fact that they are not related to zone master objects,
  which are used to affect search order for user-defined commands.

  Continued in HELP SHARED PLAYERS2
& SHARED PLAYERS2
  Some suggested uses of shared players:
  
    1. If you are working on a building project with several people, it
       may be useful to create a shared player and @lock/zone it to all of
       you.  That way, all of the players working on the project will be
       able to modify the building, as long as the shared player owns all
       the objects being built.
    
    2. If local wizards are desired, a shared player may be created and zone
       locked to the local wizards. Players building within that zone should
       be @chowning to the shared player, or logged in as it while creating
       objects. The local wizard will then be able to control anything within
       that domain as long as the object in question is owned by the shared
       player.
& ZONES  
& ZONE OBJECTS
& ZONE MASTER OBJECTS
& ZMO
  Zones are areas of the MUSH that can have the same user-defined commands
  without having to @parent every object in the zone or make the commands
  mush-wide globals.

  The default zone is NOTHING. Any building done by a player defaults 
  to belonging to the same zone that the player belongs to.
  Every zone is defined by a Zone Master Object (ZMO). The ZMO is an
  ordinary MUSH object owned by some player. A wizard may change the
  zone of an object or player to a ZMO.
  
  If the ZMO is a room, it is called a "zone master room." Most of the
  statements about ZMOs also apply to zone master rooms; for details,
  see the help topic ZONE MASTER ROOMS.
  
  See "help ZONES2" for more.
& ZONES2
  $commands on a ZMO are treated as global within that zone.
  The game attempts to match $commands for the ZMO of the player's
  location, as well as $commands for the player's own zone.

  If you want restricted global commands defined over only a small area,
  you can define that area to be part of a zone, and place the desired
  $commands upon the ZMO. If you want players to be able to use special
  commands for a culture they belong to, the $commands should go on the
  ZMO, and the players @chzoned to it so they can use the commands
  anywhere.

  See also: @chzone, SHARED PLAYERS
& matching
  Matching is the process the MUSH uses to determine which object you
  mean when you try to do something with an object. Different commands
  do matching in different ways, but most will allow you to specify
  an object as:
    * its dbref (#7)
    * its full name (Box of chocolates)
    * part of any word in its name, if nothing else shares that part (Box)
    * me (yourself)
    * here (the room you're in)
  Usually, you can also qualify an object with an adjective to help
  the MUSH determine which object you mean, when there is ambiguity.
  Adjectives include:
    * my <obj> - an object you're carrying
    * this <obj> - an object in your location (also: this here <obj>)
    * 1st, 2nd, etc. <obj> - one of a set of objects with the same names.
      Objects are ordered in the order in which they're listed in your
      inventory or room contents.
   You may combine some adjectives (my 1st box, this here 2nd box.
& &HELP
This is the AHELP index.
& RESTRICT

 Commands and functions can have their permission levels controlled
 in the mush config files, or by wizards from the game via @command
 and @function.
 
 In the config file, the syntax is:
  restrict_command command-name restriction
  restrict_function function-name restriction

 From the game:
  @command/restrict command-name=restriction
  @function/restrict function-name=restriction

(Continued in restrict2)
& RESTRICT2
 <restriction> can be one of the following:
   god        Command or function is usuable only by God.
   wizard     Usable only by wizards.
   admin      Usable only by Wiz/Roy.
   nogagged   Usable only by non-GAGGED objects.
   nofixed    Usable only by non-FIXED objects.
   noguest    Usable only by non-guest @powered objects.
   nobody     Nothing can use it. Same as the /disable switch
              to @command or @function.

 Commands can also use the 'noplayer' restriction, which stops
 player objects from using the command, as well as any generic <flag>
 or any <power>.

(Continued in restrict3)
& RESTRICT3
 In cases where there are a function and command that do the same thing
 (Like pemit() and @pemit), the command's restrictions are also checked
 when the function is called, so restricting @pemit also restricts
 pemit(). However, a function's restrictions are not checked when a
 command is called, to allow disabling side-effect functions.

 Some functions (Like name()) have non-side-effect and side-effect versions
 depending on how many arguments they're called with. The side-effect
 version can be disabled while keeping the safe non-side-effect form with
 the 'nosidefx' restriction. This can also be used to disable pure side-effect
 functions.

& changes
& 1.7.6p0
This is a list of changes in this patchlevel which are probably of
interest to players. More information about new commands and functions
can probably be gotten via 'help <name of whatever>'. 'help credits'
lists the [initials] of developers and porters that are used in the list 
of changes.

Information about changes in prior releases can be found under
help topics named for each release (e.g. 'help 1.7.2p30').
A list of the patchlevels associated with each release can
be read in 'help patchlevels'.

Version 1.7.6 patchlevel 0                      November 11, 2002

License:
 * PennMUSH 1.7.6 and later is now released under the Artistic
   License. This is an OSI-compliant open source license. See the file
   COPYRITE for the complete license text.

   Notable changes from the old license:
   * No restrictions on commercial use
   * No requirement to inform developers of improvements or submit
     modifications, though it's still a nice thing to do. Note, however
     that if you redistribute a modified version of PennMUSH, you MUST
     include source code.

   The PennMUSH devteam thanks the copyright holders of TinyMUD,
   TinyMUSH 2.0, TinyMUSH 2.2, and TinyMUSH 3.0 for their assistance
   in making this possible.
Documentation:
   * The README file has been split into README, INSTALL, UPGRADING,
     and I18N files.
Minor Changes:
   * Rooms now hear remits and lemits in them, and can be pemitted
     to. This behavior now matches that of other MUSH servers.
   * AUDIBLE objects now propagate sound @remit'd into them.
     Report by [SW].
   * Added @lock/destroy to limit who can destroy a DESTROY_OK 
     object. Suggested by Luigi@8bit.
   * PARANOID nospoof notification now includes the name of the object's
     owner as well. Suggested by Philip Mak.
   * room() no longer notifies the executor of permission errors out of
     band. It now just returns the error instead, like loc(). Suggested by 
     Philip Mak.
   * Creation times are now public information via ctime(); permission to
     examine is no longer required. This allows objects to use, e.g.,
     %#@[ctime(%#)] as a historically unique identifier of an enactor.
     Suggested by Philip Mak.
   * The reboot.db is now versioned. This will make it possible to
     @shutdown/reboot across patchlevels that change the reboot.db
     format (in 1.7.7 and later versions).
   * Rooms on an @forwardlist now receive the message as a remit,
     rather than a pemit. Suggested by BladedThoth@M*U*S*H.
Fixes:
   * More work on the great table() bug. Looks like a fix. [SW]
   * Improved VS.NET project files by BladedThoth.
   * Plugged a memory leak in deleting @locks. [SW]
   * Fixed @lock-related crash bug reported by Philip Mak. [SW]
   * General linting.
   * process_expression ignores the [ in ansi escapes. Reported in the
     context of #$ by Philip Mak. [SW]
   * Internal changes to compress(), which now returns an allocated
     string. Under Huffman compression, it should no longer be possible
     to overflow a buffer with a pathological compression tree. Initial
     concern voiced by Eyal Sagi.
   * Table and ansi didn't play well together. Reported by Ellis@M*U*S*H.
   * Config file reading should be better on Macs. Patch by Philip Mak.
   * Obsolete checks for OLD_ANSI are removed. [SW]
   * Crash bug in @function fixed. Report by Dallimar@Hemlock.
   * Change to message on failed attribute flag set, to make it more
     generic to cover all the possible failures. Report by Cerekk@bDv.
   * Translations to some languages were broken. Fixed now. Report by
     Sbot@M*U*S*H.
   * QUEUE is now visible if you control an object, as promised in the
     help. Reported by Luigi@8bit.
   * Help fixes by Mortimer@M*U*S*H, Bellemore@M*U*S*H, Hyacinth@8bit,
     [EEH], BladedThoth@M*U*S*H, Moe@M*U*S*H, Viila@M*U*S*H, Walker@M*U*S*H.
   * Comment in src/Makefile fixed by Vadiv@M*U*S*H.
   * A weird crash on @shutdown/reboot, probably attributable to a
     broken library or system call, is now worked-around. Report by
     Solarius@SWWF.
   * Audible objects with @forwardlist set are no longer concealed by
     the DARK flag.
   * Win32 project files no longer use the win32/ directory as an include
     directory, which causes problems. Reported by Gepht.

& 1.7.4p20
Version 1.7.4 patchlevel 20		       September 19, 2002

Fixes:
  * Help semaphores4 typo fixed by Mike Griffiths.
  * Help cleanup. [TAP]
  * See_All players now see hidden connected mail senders. Suggested
    by Philip Mak.
  * spellnum could introduce spurious spaces. Reported by Intrevis@M*U*S*H.
  * table() sometimes produced spurious blank rows. Reported by
    Nymeria@M*U*S*H. This is the first attempt at a fix.
  * switch() help improved. [SW]
  * enter <exit> no longer returns Permission denied, but 
    "I can't see that here", as you can only enter things. 
    Suggested by Philip Mak.
  * A one-time, one-pointer memory leak in plyrlist.c fixed
    by Vadiv@M*U*S*H.
  * Unbalanced or empty double-quotes gave weird results in page 
    and whisper. Reported by Vadiv@M*U*S*H. [SW]
  * @chan/decomp no longer shows names of channels that the enactor
    can't see. Reported by Nat@SW:ANT.
  * The lock() and elock() functions now operate properly with
    user:whatever locks. Reported by Mike Griffiths.
  * pmatch() will locate hidden players if they're visible to you
    because they're nearby. Suggested by Julian@M*U*S*H.
  * regedit and other functions that used $-substitutions for subpatterns
    could produce weird results in some cases. Reported by Bellemore@M*U*S*H


& 1.7.4p19
Version 1.7.4 patchlevel 19		       June 14, 2002

Minor changes:
  * Wizards can now unset the WIZARD flag on any thing, whether they
    own it or not. Suggested by Cerekk@bDv.
  * Circular zoning is no longer allowed. Fixes part of a bug reported
    by Philip Mak. [SW]
Fixes:
  * Win32 portability fixes. [EEH]
  * grep for 'grep' rather than 'egrep' in restart because in grep 2.5.1,
    egrep is a shell script that exec's grep instead of a link.
    Fix by Vadiv@M*U*S*H.
  * The messages for a possessive get used the object's new location
    instead of its old one. Fixed by Apollo@Restoration.
  * Attempts by unlinked exits to @link an exit could crash. 
  * %1 in @areceive was being set to the recipient rather than the giver.
    Fixed. Report by jubjup@trekmush.org
  * @uptime fix for Linux 2.4 kernel. [SW]
  * The @@() function no longer complains about commas. Report by
    Trispis@M*U*S*H. [TAP]
  * @search flags=<flaglist> is now smarter about toggles with the same
    letter and different types. Report by Philip Mak.
  * English-style matching now ignores the type of object being matched.
    This fixes a bug with, e.g., @link my 1st object=me reported by
    Oriens@Alexandria.
  * bound() now listed in the math functions list. Report by Dandy@M*U*S*H.
  * Help fix for member() by Cerekk@bDV TrekMUSH
  * The server can now transparently read mush.cnf (and included) files
    that have Dos- or Mac-style line-endings. Suggested by Paleran.
  * Crash bug in @search fixed. Reported by Philip Mak.

& 1.7.4p18
Version 1.7.4 patchlevel 18		       May 6, 2002

Minor Changes:
  * The Mersenne Twister RNG has been backported from 1.7.5 into
    this patchlevel, as it is not susceptible to some bugs that could
    cause the RNG to hang the server. Report by Bellemore@M*U*S*H.
  * Improved detection of info_slave errors. Based on patch by CU5.
  * Rooms and exits can now be @forced. Suggested by Philip Mak.
  * Deleting files from the hlp/nws/etc. directories is now sufficient
    to cause game/txt/Makefile to rebuild the txt files. Patch by
    Philip Mak.
  * A see_all player may now use @chan/decompile on any channel.
    Previously, the ROYALTY flag was required. Suggested by Oriens@Alexandria.
Fixes:
  * The QUEUE and semaphore attributes aren't listed in @decompile
    anymore. Suggested by Oriens@Alexandria. [SW]
  * Several compiler warnings fixed. [SW]
  * The LASTSITE and LASTIP attributes are now set locked and wizard by default,
    to go along with the other connection-tracking attributes. [SW]
  * Help on-vacation updated. Report by Nymeria@M*U*S*H.
  * Help for following() function added. Report by Ashen-Shugar@Rhost.
  * The last line of the access.cnf file sometimes wouldn't get read 
    properly. [SW]
  * lnum improperly cached its return values without consideration for
    changes in separator, so subsequent lnums with different separators
    broke. Reported by Rhysem and Ambrosia@M*U*S*H. [TAP]
  * Failing to speak on a channel you can't see no longer reveals the
    full channel name. Reported by Vadiv@M*U*S*H.
  * Passing a negative argument to the space() function now returns
    an error string instead of 8192 blanks. Patch by Myrddin.
  * Improved messages for following/unfollowing an ambiguous object.
    Reported by Philip Mak.


& 1.7.4p17
Version 1.7.4 patchlevel 17		       April 14, 2002

Minor Changes:
  * The on-vacation flag, if in use, is no longer automatically cleared
    on connect. Instead, the player is warned on connect (and at each
    dump) that their flag is set. Suggested by Nymeria@M*U*S*H.
Fixes:
  * Improved help for edit(). Suggested by Trispis@M*U*S*H [SW]
  * List functions with null elements and a null output seperator could
    trip end-of-buffer checks and stop in the middle of a list. [SW]
  * valid() was inconsistent in how it handled attribute names with lower-case
    letters compared to what everything else does. Reported by Philip Mak. [SW]
  * @open could cause crashes in some unusual contexts. Reported
    by Dandy@M*U*S*H.
  * Improved sort()'s autodetection of list types. [SW]
  * Fixed a problem with sorting dbrefs larger than the highest one in the 
    db. [SW]
  * Mac portability fixes. [DW]
  * Help for @open clarified. Suggested by fil@M*U*S*H.
  * Help for kill clarified. Suggested by Philip Mak.
  * Channel titles can no longer contain newlines or beeps. 
    Report by Nome@M*U*S*H.
  * soundex behaved badly with extended characters. [SW]
  * inc() and dec() now behave like the help says, regardless of whether
    tiny_math is set or not. Their behavior on null strings and strings
    that do not end in a digit depend on the null_eq_zero setting.
    Reported by Wayne@PDX.
  * The panic db file descriptor was never closed after reading a
    panic dump. [SW]
  * DOES removed from help attribute list. Suggested Philip Mak.
  * Under no circumstances should connection to a null-named player
    be allowed. Suggested by Wayne@PDX.
  * 'with' no longer allows use of $commands on remote objects you
    don't control. Report by Nammyung@M*U*S*H.

& 1.7.4p16
Version 1.7.4 patchlevel 16		       March 11, 2002

Minor changes:
  * After using 'register' at the connect screen, the player is
    no longer disconnected. Suggested by Philip Mak.
  * 'help mail functions'. Suggested by Trispis@M*U*S*H.
  * Messages associated with drop, give, and get are now more
    verbose and provide more information about who did what to whom.
    Suggested by Philip Mak.
  * Attrib locks did case-sensitive comparison of values, which is not
    what you probably want. No longer. Reported by Philip Mak. [SW]
  * QUEUE and sempahore attributes are now removed (not just emptied)
    when drained or notified to 0. [TAP]
Fixes:
  * Improvements in handling ansi in string functions. [SW]
  * @clone/preserve didn't preserve when cloning exits. Reported by
    Bellemore@M*U*S*H. [SW]
  * A significant bug in the manual notification of timed semaphores has 
    been corrected. [SW]
  * Revian@M*U*S*H pointed out that user-defined commands starting with
    "@" that match the names of standard attributes don't behave as
    you might expect. This is now documented in help user-defined commands.
  * Security checks for attribute setting used the owner of the setting 
    object, not the setting object itself. Report by Howie@New Frontier.
  * help set() improved based on report by Tareldin@M*U*S*H.
  * folderstats() did not behave as promised in the help. Now it
    does. Report by Trispis@M*U*S*H.
  * Typo in src/log.c fixed by Nathan Schuette.
  * Improved help for DEBUG. [SW]
  * Aliased 'help ^' to 'help listening2'. Suggested by Philip Mak.
  * MacOS portability fixes. [DW]
  * The sigusr1 handler would reinstall itself as the sighup handler
    on systems that don't provide persistent signals. 
    Fixed by Bellemore@M*U*S*H.
  * &a=b me now properly clears the attribute A=B. Reported by 
    Trispis@M*U*S*H. In addition, now @tel #1234= produces an error,
    as it should. [SW]
  * mail functions can now be called by an object on anything it controls
    (typically, its owner). Suggested by Trispis@M*U*S*H.
  * The givee is now correctly passed in %1 to @give/@ogive/@agive,
    and documented. Reported by Philip Mak.
  * Added hints for Irix 6.x by Vexon@M*U*S*H.
  * i18n fix for function invocation limit message.
  * Clarification in help @alias by Philip Mak.
  * @set obj=!puppet repeatedly no longer repeats the "not listening"
    message. Reported by Philip Mak.


& 1.7.4p15
Version 1.7.4 patchlevel 15		       February 8, 2002

Minor Changes:
  * @dolist and iter(), where multiple tokens are replaced (## and #@),
    now do both replacements at once. This is more efficient in several
    ways and fixes a problem where if the second token gets into the
    string from a replacement of the first, it gets replaced. (iter(a#@,
    ##) should return a#@, not a1). [SW]
  * setunion no longer eats empty list elements. [SW]
  * The help text for items() is now more descriptive of how it works
    and differs from words(). Suggested by Zen@SW1.
  * When you attempt to @chzone an object to a ZMO without a zone-lock,
    a default zone-lock of "owner of the ZMO" is now set, and the
    attempt succeeds. Suggested by Linda Antonsson.
  * In the French message translation files, the word 'drapeau' and
    'flag' were used interchangeably. I've standardized on 'flag'.
    Report by Vexon@M*U*S*H.
Fixes:
  * Message typo fixed by Bellemore@M*U*S*H.
  * No more ansified names in logged shutdown messages. Report by
    Bellemore@M*U*S*H.
  * Messages when destroying players now take into account the 
    destroy_possessions and really_safe settings. Suggested by Wayne@PDX.
  * The parser no longer strips any first layer of braces in, e.g.
    @switch action clauses, but only when the first character in the
    clause is a brace. This prevents @sw 1=1, @wait me={@emit 1; @emit 2}
    from being misparsed and running @emit 2 immediately. Reported by
    Azratax@Azmush. [TAP]

& 1.7.4p14
Version 1.7.4 patchlevel 14		       January 4, 2002

Minor Changes:
  * The global function invocation limit is now 5 times the per-evaluation
    function invocation limit, to provide some flexibility in cases
    where you run a small number of functions that cause a larger
    number of other functions to be evaluated (e.g., using tel()
    to move players into rooms with function-laden descriptions). [TAP]
Fixes:
  * Mortals are now restricted in which html tags they can generate
    when pueblo support is enabled. Suggested by BladedThoth.
  * @sitelock/name !<name> was improperly case-sensitive in its
    matching. Reported by Linda Antonsson.
  * Better invocation count checking and aborting on reaching limit.
    Reported by Ashen-Shugar. [TAP]
  * Beep characters are ignored when matching object listen patterns.
    Suggested by Wayne@PDX.
  * The end-of-dump marker is checked when reading the chat database.
    Suggested by Bellemore@M*U*S*H. [SW]
  * @lock obj=attrib:value locks were broken. Reported by Linda
    Antonsson.
  * Minor help fixes.

& 1.7.4p13
Version 1.7.4 patchlevel 13		       November 30, 2001

Minor changes:
  * options.h.dist mentions Darwin as well as MacOS X. [DW]
  * PCRE updated to 3.7. [SW]
  * When CHAN_NAME_LEN is increased beyond 30, the @chan/list header
    line is misaligned, and other strange things can happen to
    @chan/list. Reported by Bladed Thoth
Fixes:
  * Crash bug in chat channels reported by BladedThoth.

& 1.7.4p12
Version 1.7.4 patchlevel 12		       November 9, 2001

Minor changes:
  * @dol/delim is now @dol/delimit, for Mux compatibility. [SW]
  * /preserve switch for @chownall works like @chown's /preserve switch.
    This changes the default behavior of @chownall, which used to
    preserve everything, to work like @chown and strip privileged bits.
    Suggested by Taladan@M*U*S*H.
Fixes:
  * Warnings in index-files.pl are no longer shown. Report by Noltar@Korongil
  * Additional support for ansi in channel names. Ansi is now stripped
    when sorting channels and when matching names for @chan/decomp and
    @chan/what.  Reported by Oriens@Alexandria.
  * Help @decompile clarifies the /flags switch. Suggested by Oriens@Alexandria
  * Source is indented before diffs are produced.
  * Typo in help zmr correct by Oriens@Alexandria.
  * Players disconnecting without QUIT continued to use CPU until fully
    disconnected. Fixed. Report by Protagonist@M*U*S*H. [SW]


& 1.7.4p11
Version 1.7.4 patchlevel 11		       October 15, 2001

Minor Changes:
  * In places like switch() that can match <number, the numbers
    are now treated as floating point, so they need not be only integers.
    However, they must be pure numbers; "<3km" will not work.
  * Tests for channel name matches now disregard ansi. Suggested by Wayne@PDX.
Fixes:
  * MacOS linting. [DW]
  * next() could reveal unfindable players. Reported by Jeffrey@TheHotel. [TAP]
  * making diffs or a dist now insures that switches.h, etc. are rebuilt
    for the Mac/Win32 crowd. Reported by many people.
  * Some warnings discovered with compiling with gcc 3.0.1 fixed. [SW]
  * Potential crash-or-worse bugs that could be caused by malformed
    save messages fixed. [SW]
  * @mail to players with names starting with numbers works correctly now.
    Report from Mike Wesson. [SW]
  * Fewer logged warnings from failed convtime()s. [SW]
  * Help for page now mentions /blind. Reported by Oriens@Alexandria.
  * Attempting to set an invalid priv on a channel now produces a
    better message. Reported by Oriens@Alexandria.
  * Improved message when a Wizard overrides a chan join lock by Wayne@PDX.
  * Another way to end up inside yourself fixed. Report by Ashen-Shugar. [TAP]
  * Help default/edefault syntax clarified by Delina@ST:VAAE
  * Help math functions clarifies 'number'. Suggested by Delina@ST:VAAE
  * Information on the patches.h header added to the FAQ file. Suggested 
    by Kahmy. [SW]
  * Potential crash in @set fixed. Report by Michael Loftis [SW]
  * The Unfindable flag is checked on all levels of containers, not just
    the immediate location. Suggested by Oriens. [SW]
  * NT_TCP fix by Bellemore.
  * secure() now escapes ^, as the help says it does. Report by Gabriel Matlin.
  * link_anywhere now lets you actually @link anywhere, instead of just
    letting variable exits link anywhere. Report by Viila@M*U*S*H.
  * help home now returns help homes, not help home(). Suggested by 
    Gary Williams

& 1.7.4p10
Version 1.7.4 patchlevel 10		       September 7, 2001

Fixes:
  * @clone changes in p9 introduced a crash bug. Fixed.
  * Typo in mushcnf.dst fixed by Noltar@Korongil.

& 1.7.4p9
Version 1.7.4 patchlevel 9		       September 4, 2001

Minor changes:
  * @clone can optionally specify a new name for the clone.
    Patch by Bellemore@M*U*S*H, inspired by mux.
  * die() can take a third argument which, if true, will cause it to
    return the list of individual die rolls rather than the sum.
  * NT_TCP option moved to options.h.dist, and @config/list compile now
    reports whether it's on or not. Suggested by Glonk@GlonkMUSH
  * QUIET flag affects the "Teleported." message as well.
    Suggested by Glonk@GlonkMUSH.
  * pos() and strmatch() strip ansi and html markup before matching. [SW]
  * Slight optimizations for many of the functions that strip markup. [SW] 
  * chat_strip_quote setting now applies to @*wall and say. Suggested by
    Glonk@GlonkMUSH. [SW]
  * @malias/who is now the same as @malias/members. Suggested by
    Oriens@Alexandria.
  * Small code change in do_chat_by_name so that find_channel_partial_on
    can behave as documented. Suggested by Michael Loftis
Fixes:
  * p8 broke regeditall when the replacer was null. Fixed.
    Reported by Nymeria@M*U*S*H.
  * Some unused variables removed, and pcre.h included in parse.c.
    Reported by Sidney@M*U*S*H.
  * index-files.pl produced an uninitialized value warning if a help file
    had only a single entry (or admin entry). Warning removed.
    Reported by Nymeria@M*U*S*H.
  * Fixed to help lstats() to mention stats() as alias. Reported by
    Glonk@GlonkMUSH.
  * Help edit() fix by Sash@SW:Uprising.
  * Improved failure message for @password. Suggested by Mike Wesson. [SW]
  * alphamin()/alphamax() were stripping markup from what they returned. [SW]
  * PARANOID flag is now only visible to owners. Reported by 
    Bellemore@M*U*S*H.
  * Improved error message when trying to rejoin a channel. [SW]
  * In Win32 NT_TCP mode, ident lookups are now done and the LASTIP
    attribute doesn't get corrupted. Patch by Bellemore@M*U*S*H.
  * @chan/describe now works along with @chan/desc. Suggested by 
    Trispis@M*U*S*H
  * 'teach'ing a motion to a follower didn't work right. Reported by
    Cheetah and Viila@M*U*S*H.
  * Security bug in follow fixed. Reported by Walker@M*U*S*H.
  * The &ecirc; and &euml; entities were not correctly returned in
    Pueblo mode. Fixed by [NG].
  * Help for trig functions improved. [SW]
  * Pueblo references no longer give Chaco's (defunct) website.
    By Noltar@Korongil.

& 1.7.4p8
Version 1.7.4 patchlevel 8		       July 22, 2001

Minor changes:
  * restart is a bit more precise in the "Mush already active" message.
    Suggested by Lucas Layman.
  * When a player's creation is refused because creation/registration
    is globally turned off, show them register.txt instead of down.txt.
    Patch by Bellemore.
  * The NOSPOOF flag is now visible only to the player themself. [SW]
  * regedit can now use backreferences in the replacer. [SW]
Fixes:
  * ident lookups were broken on win32. Reported by Bellemore. [SW] 
  * ident query timeouts could get doubled mistakenly. [SW]
  * Typo in mushcnf.dst fixed by Noltar@Korongil.
  * Fix to help puppets2 by TurtleKnee@M*U*S*H.
  * Help pcreate() added. Report by Eratl@M*U*S*H.
  * @pcreate messages capitalized by Oriens@Alexandria.
  * create() used 10 as the default cost, instead of the configured
    default. Report by 8bitMUSH.
  * Inactivity timeouts longer than 1 day didn't work. Fixed and
    efficiency of the check improved. Reported by Bellemore@M*U*S*H.
  * Null @aliases are no longer allowed. [SW]
  * Cleanup to ident for situations when the remote host isn't running
    an ident server. [SW]

& 1.7.4p7
Version 1.7.4 patchlevel 7		       July 02, 2001

Major changes:
  * %r can now evaluate to one character or two, based on a new config 
    option, newline_one_char, which defaults to being yes. This allows
    %r to be used as a list delimiter. However, this may
    break softcode which expects strlen(%r) to be 2, but it's probably
    smarter to fix the softcode than turn off this option. [sw]
  * If a command and a standard attribute have the same name, the
    command takes precedence. So if you have an @attribute named
    "PEMIT", @pemit me=foo will do the command, not set the attribute. [SW]
Minor changes:
  * When someone attempts to create too many attributes on an object,
    the log indicates who and which object. Suggested by Frob@Battlestar
    Galactica:TSC.
  * Buncha tprintfs replaced with notify_formats. [SW] 
  * New local_connect() and local_disconnect() hooks in local.dst.
    Suggested by Eratl@M*U*S*H.
  * lookup_player now deals with player names prefixed with "*",
    so a bunch of commands like @newpassword will now treat those
    arguments. Suggested by Glonk@GlonkMUSH.
  * Make is more verbose about alerting you to changes in the 
    src/*.dst files.
  * The message for undestroying someone else's object more closely matches
    the destroy message. Suggested by Noltar@Korongil.
  * Server output that used to be tagged with "PRE" for Pueblo is now
    tagged with "SAMP", because the original Pueblo client did not correctly
    handle "<BR>\n" in PRE, and the newer clients that are supporting
    the pueblo protocol, like MUSHclient, do handle it correctly, causing
    an incompatibility problem. Our workaround is to avoid PRE. 
    Reported by [NJG].
  * The WHO list output is tagged <img xch_cmd=html> for Pueblo to get
    appropriate newline handling. [NJG]
  * help @mail mentions help @malias. Suggested by Trispis@M*U*S*H.
  * Matching code now treats players you can't see like disconnected players
    when matching *player. Reported by Walker@M*U*S*H.
  * @newpassword now confirms whose password was changed. Suggested by
    Xyrxwyrth@M*U*S*H.
  * @chan/who and cwho() now include objects on the channel. Suggested by
    Glonk@GlonkMUSH.
  * q-register lookup is slightly faster. [SW]
  * Floating-point numbers in exponential format (6.02e23) are always
    accepted, not just when tiny_math is set. [SW]
  * isint() and isnum() ignore the null_eq_zero option, since they already
    ignore tiny_math. [SW]
  * time() and convsecs() take an optional timezone argument that,
    if 'UTC', makes them act the same way as utctime() and convutcsecs(). 
    From MUX2. [SW]
Fixes:
  * Additional range checking to avoid some bugs reported by Alierak. [SW]
  * Fix to buglet in @name error with PLAYER_NAME_SPACES reported by
    Luke@M*U*S*H.
  * Typo in @name error message fixed by Luke@M*U*S*H.
  * One could @pcreate players past the hard db limit. Reported by Z@Korongil.
  * Typos in config_h.SH and options.h.dist fixed by Oriens@Alexandria.
  * Under some conditions, you could double-join a channel.
    Reported by Xyrxwyrth@M*U*S*H, investigated by Steven@Champions.
  * Error message for @chan/desc improved. Reported by Oriens@Alexandria.
  * Typo in alias.cnf fixed by rodregis@M*U*S*H.
  * @mvattr sometimes failed to remove the old attrib, when it was a 
    standard attrib that could be abbreviated (@mvattr a/desc=b).
    Fixed by Walker@M*U*S*H.
  * Some english-matching (like 'get 1st foo') would fail. Reported by
    Mystery8.
  * Typo in help @verb reported by Greck.
  * MacOS tweaks. [DW]
  * Better detection of numbers that are too big. [SW]
  * Wizards could crash the server by entering objects in their own
    inventory. Reported by Howie@New Frontiers.

& 1.7.4p6
Version 1.7.4 patchlevel 6		       June 11, 2001

Minor changes:
  * English-style matching has been added to some more commands, 
    to help with the stricter ambiguity checking (@teleport my 3rd foo=box, 
    etc.). [SW]
  * @pemit/list no longer does its useless ## substitution. [SW] 
  * capstr() and art() skip leading ansi and html. [SW]
  * table(), alphamin(), alphamax(), comp(), lcstr(), ucstr(), strinsert(), 
    and delete() are all ansi and html aware. Mixing html and ansi in their 
    arguments is probably a bad idea, though. [SW]
  * reverse() and scramble() are ansi-aware, and still will break html, but 
    in a different way than before. [SW]
  * foreach() strips ansi and html from the string before doing its things. [SW]
  * Complete Norwegian translation by Kenneth Aalberg.
Fixes:
  * Bug in growing hash tables fixed. [SW] 
  * Typo in copyright fixed. Reported by Cheetah@M*U*S*H.
  * Unused variable removed from fun_ansi. Reported by Sidney@M*U*S*H.
  * Mac portability stuff. [DW]
  * Wizards could @chown garbage objects. [SW]
  * Wizards could give to garbage objects. [SW]
  * Wizards could read God's @mail. [SW]
  * Eliminated some compiler warnings. [SW]
  * mid() was quite broken with ansi. right() was less broken. 
    Both hopefully fixed for good. [SW]
  * Fixed a problem with the attribute used with foreach() evaluating from 
    the perspective of the wrong object. [SW]
  * before(), after(), and wrap() are now classified as string functions
    in the help. [TAP]
  * help wildcards now mentions ?. Suggested by cmintrnt@M*U*S*H.
  * help fixes by Jeff Ferrell.
  * Problems with wrap() when the text included %r%r (or started with %r)
    reported by Noltar@Korongil.
  * If you somehow managed to load a corrupt db with a parent loop,
    lparent could infinite-loop. Reported by Ashen-Shugar. [TAP]


& 1.7.4p5
Version 1.7.4 patchlevel 5		       May 25, 2001

Fixes:
  * Fix to uninitialized variable that could cause ansi to bleed
    on some systems. Patch by Luke@M*U*S*H
  * Prototypes for ansi_align and ansi_save added to externs.h. [DW]
  * FreeBSD hints file updated to get rid of a compiler warning. [SW]
  * Setting hate_dest to no will not disable @recycle [SW]
  * switchinc.c updated. [DW]


& 1.7.4p4
Version 1.7.4 patchlevel 4		       May 13, 2001

Minor changes:
  * Internally, the /folder switch is now /folders, which prefix-matches
    to /folder and also lets @mail/folders work as syntactic sugar.
  * fun_ansi has been rewritten to use less buffer space by consolidating
    ansi codes. New codes for turning off ansi attributes (like hilite)
    also added.  Patch by Luke@M*U*S*H.
  * /silent switch to give suppresses default messages when giving
    money to players. Suggested by 8BitMUSH.
  * Old port concentrator code removed. [SW]
  * On linux, @uptime reads /proc files instead of running 'uptime' [SW]
  * Code that uses strdup and then adds a MEM_CHECK record for "string"
    now use a wrapper function that does it automatically. [SW]
Fixes:
  * Paging a page-locked player didn't give the appropriate messages.
    Reported by Steven@Champions.
  * left, right, and mid are now ansi-aware. Patch by Luke@M*U*S*H.
  * Help fixes to lexits(), name() (Noltar@Korongil), 1.7.4p3 (Z@Korongil).
  * win32/cmds.h updated with prototypes for dismiss and desert by
    Noltar@Korongil. And hdrs/externs.h, too, by [SW].
  * Memory leak with using alphabetic q-registers in queued commands fixed.
    Report by Jayvin@Dynamix [SW]
  * Added hints/openbsd.sh to distribution.
  * Mac portability linting. [DW]
  * Several memory leaks in @malias code fixed. [SW]

& 1.7.4p3
Version 1.7.4 patchlevel 3		       April 23, 2001

Commands:
  * unfollow with no args now stops you from following everyone.
    dismiss command stops people from following you.
    desert command stops people from following you or leading you.
    Idea by Oriens@Alexandria. Names suggested by Noltar@Korongil
Minor changes:
  * MONITOR announcements of disconnects distinguish hidden disconnects.
    Suggested by Oriens@Alexandria.
  * The Uptime field of INFO shows first start time, not last reboot time.
    Suggested by Trispis@M*U*S*H.
Fixes:
  * Exact matches are now preferred over partial matches, and no longer
    result in ambiguity. Report by Steven Viscido.
  * Message mentioning INHERIT changed to TRUST by Xyrxwyrth@M*U*S*H.
  * Distributed register.txt file is now more descriptive. 
    Suggested by Xyrxwyrth@M*U*S*H.
  * The ctime(), mtime(), restarttime(), and starttime() functions now 
    return 2-digit days (01 vs. 1). Reported by Z@Korongil.
  * @malias output uses the alias token more consistently. Suggested by
    Kyieren@M*U*S*H.
  * hints/solaris_2.sh modified a bit.
  * Mac portability fixes
  * Options.h clarification suggested by rodregis@M*U*S*H.
  * Cosmetic bug in @halt fixed. Report by Trispis@M*U*S*H.
  * Fixed a fencepost error in regedit*() that could generate garbage text.
    Reported by Vadiv@M*U*S*H


& 1.7.4p2
Version 1.7.4 patchlevel 2		       March 23, 2001

Major changes:
  * The object matching routines have been modified. Some things you may
    notice:
    * Ambiguous cases are more often reported as such (rather than you
      getting one of the ambiguous matches arbitrarily).
    * locate() now returns #-2 as promised. Reported by Jeff Ferrell.
    * A few functions that used accept player names now require
      the use of *playername to match the player (e.g. mail(), hidden()).
      (This is generally more consistent).
Minor changes:
  * @tr of a nonexistent attribute now reports that. Report by Z@Korongil.
  * TEL_OK is an alias for JUMP_OK. Suggested by Kyieren@M*U*S*H.
  * Added 'help i18n' (aka help translation). Suggested by Kyieren@M*U*S*H.
  * When you use 'teach' and, as a result, run the command you are teaching,
    it is treated as if the command were run by a player from the socket --
    that is, attribute sets are not evaluated. Suggested by Xyrxwyrth@M*U*S*H.
  * See_All players can see all channels and their members, too.
    Suggested by Oriens@Alexandria.
  * When trying to join yourself to a channel, we only check channels
    you're not on; when trying to leave a channel, we only check channels
    that you are on. This is handy for disambiguating similar prefixes.
    Suggested by Oriens@Alexandria.
  * When you're following a leader and the leader moves, you're told that
    that you're following them before you attempt to move. Suggested by
    Oriens@Alexandria.
  * @stats/table is no longer restricted.
Fixes:
  * @grep/iprint produced highlighted strings matching the case you
    gave, not the case actually found. Reported by Reagan@NF
  * @search/lsearch by powers could sometimes get you the equivalent
    flag-bit instead of power-bit. Reported by Reagan@NF
  * Configure fix.
  * hpux-gcc hint file now included.
  * Nested ansi() broke again in p1. Fixed now. Reported by Intrevis@M*U*S*H
  * Added Configure check for <netdb.h> to help Cygwin builds.
    Reported by Xyrxwyrth@M*U*S*H.
  * Help fix or two.
  * Grammatical correction by Eratl@M*U*S*H in @boot/me error message.
  * Cosmetics of @mail with folders > 9 improved. Reported by Bellemore@M*U*S*H
  * One could be disconnected at the connect screen under some conditions
    for no good reason. Reported by Oriens@Alexandria. [SW]
  * Compile error when ROYALTY_FLAG not defined patched by Noltar@Korongil.
  * Fixed infinite loop reported by Xyrxwyrth@M*U*S*H. [SW]
  * It's no longer posible to connect to a GOING player.

& 1.7.4p1
Version 1.7.4 patchlevel 1		       March 17, 2001

Minor changes:
  * Speedup for repeat() function. [TAP]
  * Hint for openbsd, which appears to have a broken IPv6 configuration. [SW]
  * Some OS-dependent defines have been removed.
  * ansi() now only adds a maximum of 7 codes to the string. [TAP]
Fixes:
  * The restrict_command for rob has been removed from restrict.cnf
    Reported by Kyieren@M*U*S*H.
  * Help fixes by Kyieren, rodregis, and Luke @ M*U*S*H, Datron@SW2, 
    and Noltar@Korongil.
  * stripansi() didn't correctly handle multiple ansi codes in
    sequence. Reported by CU5@WCX.
  * Linting for warnings in pcre. [SW]
  * Configure now sends mailing list subscription stuff to the new 
    list address.
  * Updated examples in access.README to use dbrefs.
  * Updated a reference to the rob command in 'give' errors. Noted by
    rodregis@M*U*S*H.
  * median was broken. Reported by Parax@SandsMUSH.
  * Fixes to update.pl's handling of CHAT_TOKEN_ALIAS and the like.
    Noted by rodregis@M*U*S*H

& 1.7.4p0
Version 1.7.4 patchlevel 0                     March 7, 2001

Major Changes:
  * This is now the stable minor version. PennMUSH 1.7.2 is no longer
    supported except to help people transition to this version.
Commands:
  * The practically useless 'rob' command has been removed.
Minor Changes:
  * A virtually complete French translation joins the Swedish and
    Hungarian ones! Congratulations to Jean-Michael Amblat and
    Guillaime Lupin.
  * The index-files.pl script handles long help topic titles better when
    creating the index of help entries. [SW]
  * Config options that can be set with @config/set are now documented in
    mush help. [SW]
  * A @config/set of a dbref option now checks dbref for validity. [SW]
  * An ansi_normal code is added at the end of each channel title.
  * You can clear attributes that have invalid names. [SW]
  * stripansi() removes HTML markup as well as ANSI. [SW]
  * @poll and @doing cannot have ANSI or HTML markup. [SW]
  * soundex() and soundslike() strip ANSI and HTML. [SW]
  * The maximum length of attribute names has been limited to 1024 
    characters. [SW]
  * Nesting ansi() functions now works better. Patch by Luke@M*U*S*H.
  * help credits explains [initials] used herein. Suggested by Kyieren@M*U*S*H
Fixes:
  * Help fixes by Nymeria, Balerion, Trispis, Vexon (all@M*U*S*H),
    Jeff Ferrell, and [SW,LdW]
  * The two-argument forms of regmatch() and regmatchi() were backwards
    when it came to case-sensitivity. [SW]
  * @search on zone class did parent instead. Fix by Luke@M*U*S*H.
  * Use of @mail after @mail/nuke could cause a crash.
    Reported by Brazil. [SW]
  * make update handles the include directive correctly. [SW]
  * The admin WHO output looks better when locations reach 5-digit
    dbrefs now.
  * regedit() and regeditall() were case-insenstive. Fixed. [SW]
  * The code for log() was changed some time back to allow an optional
    base argument, but the help and function table were never updated. [SW]
  * owner() could be used to determine if any attribute existed on any
    object. [SW]
  * atrlock() has been cleaned up, fixing many bugs. [SW]
  * Some list functions that evaluate attributes could be used to determine
    if the attribute existed even if the object doing the function couldn't
    normally see the attribute. Fixed, and their error messages are now
    consistant with the other list functions (In other words, no errors, just
    a null string) [SW]
  * Idle timeout is now checked every minute rather than at dbck intervals. 
    Based on a report by Noltar@Korongil.
  * Cleanup of signed/unsigned casts and signal handlers. [SW,DW]
  * forbidden_name now does a case-insensitive comparison.
    Reported by Kyieren@M*U*S*H.
  * Blank lines at the start of help files are now correctly ignored
    on Win32 and Mac systems as well as Unix. Report by Nymeria@M*U*S*H.
  * functions() didn't show @functions. [SW]
  * Nuked players weren't getting removed from @maliases. [SW]
  * Database corruption caused by reading a db with over-long attribute
    names or with attributes starting with quotes fixed. [SW]
  * Crash bug in @attribute/rename fixed. [SW]
  * Potential memory leak in help_command fixed. [SW]
  * Warnings removed. Reported by [NJG]
  * Windows NT native IO (NT_TCP) stuff should work again. Reported by
    Bellemore@M*U*S*H. [NJG]
  * @forwardlist now requires that you control the target, be pemit_all,
    or pass the target's @lock/forward. Report by Vadiv@M*U*S*H.
  * unparse_flags didn't handle exit toggles. Report by Draci@Chaotic.
  * Casting and cleanup to enable compiling with lcc [SW]
  * A potential problem with regexps with heavy backtracking fixed. [SW]
  * Memory leaks with @clock fixed. [SW]
  * Typo in spellnum() "fourty" fixed. Reported by Kyieren@M*U*S*H.
  * @malias/set didn't work. Reported by Kyieren@M*U*S*H.
  * Win32 portability fixes. [NJG]
  * MacOS portability fixes [DW]
& 1.7.5p12
Version 1.7.5 patchlevel 12                     November 3, 2002

Fixes:
   * Another bug in wrap() fixed. Reported by Rhysem. [SW]
   * Bug in @wall fixed. [SW]
   * Variable renaming to avoid C99 keyword 'conj'. [SW]
   * Win32 project files for MSVC++ updated by Mark.
   * Several portability fixes for MS VS.NET's compiler by BladedThoth.
   * flip() and reverse() didn't mix well. Better now.
     Reported by Julian. [SW]
   * Compiling with CHAT_SYSTEM undefined works again. Report by
     BladedThoth.
   * bxor() was actually doing a bor(). Reported by Sketch@M*U*S*H. [SW]


& 1.7.5p11
Version 1.7.5 patchlevel 11                     October 31, 2002

Config:
   * New mush.cnf option only_ascii_in_names (defaults to yes) prohibits
     the use of extended characters in names. Games that are running
     in non-English locales will probably want to set this to no instead. 
     Suggested by Philip Mak. [SW]
Commands:
   * Added @hook/before and @hook/after [SW,3]
Locks:
   * You can now use power^<power> and channel^<channel> in locks
     to test if the enactor has a given power or is on a given channel.
     Patch by Vadiv@M*U*S*H.
   * @lock/dropto, if set on a room, can prevent objects from being
     affected by the room's drop-to. Inspired by Oriens@Alexandria.
Functions:
   * The sha1() function computes the SHA-1 cryptographic hash of a string.
   * A new nosidefx function restriction to allow disabling the side-effect
     version of a function while still enabling the informational version.
     For things like name() and parent(). [SW]
   * @function's report includes more function restrictions in the flags
     field. [SW]
Minor changes:
   * Modularization of code for itemizing lists by Vadiv@M*U*S*H.
   * If there's no connect.html and you're on an html connection,
     connect.txt is now better formatted when sent to you. Same for 
     other cached text files. Suggested by BladedThoth@M*U*S*H.
   * CRYPT_SYSTEM 1 now behaves like CRYPT_SYSTEM 3 (replacing
     system-crypt passwords with SHS passwords). Suggested by Vadiv@M*U*S*H.
   * flag_table is no longer referenced anywhere except when it is used
     to seed the ptab_flag at startup. A stub "flag_add" function has
     been added to make life easier for hardcoders. Suggested by
     Gepht.
Fixes:
   * sig.c was broken on systems without sigprocmask. Reported by
     Arithon@Oracle
   * Bug with paging disconnected players and @away fixed.
     Reported by Vadiv@M*U*S*H.
   * Bashisms that crept into utils/mkcmds.sh has been replaced by
     more portable alternatives based on Configure's results. 
     Reported by Jason Newquist.
   * Trigonometric functions were broken for non-radian degree types.
     Fixed up.
   * @decomp <room>/<attrib> didn't properly use 'here' as the name
     of the object in its output. Reported by Oriens@Alexandria.
   * Wizards can now modify any lock on anything but God. Reported by
     Brian Favela.
   * ex/mortal and ex now produce identical output when a mortal 
     examines an object owned by someone else. Reported by Philip Mak.
   * We do a little better about trying to close html and ansi tags
     in all conditions. Bugs reported by BladedThoth @ M*U*S*H.
   * whisper/@pemit to a puppet should be relayed to the owner, even if the 
     owner is in the same room. Discovered thanks to MUSH sound test
     suite designed by Trispis@M*U*S*H.
   * The --longest switch in game/txt/Makefile was broken. Report by
     Nymeria@M*U*S*H
   * Help fixes by Noltar@Korongil and Intrevis@M*U*S*H
   * The M_READ extmail bit is now renamed M_MSGREAD, as M_READ conflicts
     with an included define on Solaris. Report by Jason Newquist.
   * Setting flags using single characters was not well documented, and
     didn't respect the character case. Reported by Intrevis@M*U*S*H.
   * @chown by a Wizard attempted to debit the Wizard's money, rather than
     that of the new owner of the object, which violated expected conservation
     of money. Reported by Peter Bengtson.
   * Several bugs in wrap()'s output fixed. Reported by Balerion@M*U*S*H. [SW]


& 1.7.5p10
Version 1.7.5 patchlevel 10                     September 19, 2002

Major Changes:
   * Commands can now be restricted by generic flags or powers.
     Several mush.cnf options (restricted_building, free_objects,
     hate_dest, player_locate, cemit_power) are now restrict.cnf
     restrictions instead. By Vadiv@M*U*S*H.
Functions:
   * When a set function (setdiff, etc.) is called with 4 arguments,
     if the last one isn't a valid sorting category, it's treated as
     the output separator.  Inspired by Mux [SW]
   * checkpass(), a wizard function that checks a string against a player's
     password. Requested by Writh@M*U*S*H.
   * regedit() and variants can now accept multiple regexps and
     replacements, in order, like edit(). By Walker@M*U*S*H.
   * comp() can take a third argument to specify the type of 
     comparison to make. Suggested by Philip Mak.
   * The trigonometric functions now take an optional argument to
     control how the angles they work with are measured to allow them
     to accept angles in degrees as well as the default radians. [SW,MUX2,Rhost]
   * Added ctu() for converting between angle measurements. [SW,MUX2,Rhost]
   * Added atan2(). [SW]
   * dist2d() and dist3d() can take floating-point numbers. [SW]
   * Other small cleanups in the math functions. [SW]
Mail:
   * The MAIL_SUBJECTS option has been removed. @mail now includes
     subjects mandatorily. Suggested by Vadiv@M*U*S*H.
Minor Changes:
   * When a player @clones an object owned by another player, the
     clone is now owned by the @cloning player, instead of the original
     owner. Fixes a quota transfer issue reported by Sparta and
     Philip Mak.
   * The flag table is no longer walked with a linear search. Instead,
     ptab_firstentry and ptab_nextentry are used. Flags no longer need
     to be added in a particular order or groups in flags.c, and flags
     added through hardcode should work better. Patch by Vadiv@M*U*S*H
   * Error message for wrong number of arguments to a function
     now tells you how many arguments it thinks you gave.
     Suggested by Philip Mak.
   * GAGGED players may now perform mail reading and maintenance.
   * Internal reorganization of signal code. [SW]
   * Attempts to speak on a channel that you can't speak on or see
     now fail and command parsing continues. Suggested by Vadiv@M*U*S*H.
   * The amount of CPU time spent running a queue entry can be limited.
     This helps reduce the impact of some types of denial-of-service attacks.
     New mush.cnf directive queue_entry_cpu_time. This currently
     works only on Unix systems with setitimer. [SW]
   * Internal rewrite of page/whisper code by Vadiv@M*U*S*H.
   * Flag set/reset messages now include the name of the target object.
     Suggested by Kyieren@M*U*S*H.
   * game/txt/Makefile now includes options to limit the number of
     news/etc topic aliases that are included in the 'entries' indices
     generated by index-files.pl. Suggested by Nymeria@M*U*S*H.
   * Minor inconsistencies in @sweep output punctuation reported by
     Cmintrnt@M*U*S*H have been fixed.
   * Added hints/cygwin.sh, tested with cygwin 1.3.12. Added additional
     cygwin build information to README.
   * The whisper-pose message is now Player senses: <pose>, with no
     quotation marks added. This matches all other pose-type messages
     in the server. Suggested by Philip Mak.
   * Only escape codes described in the help are allowed in timefmt() [SW]
Fixes:
   * Archaic help reference to FORCE_WHITE removed. Noted by Oriens@Alexandria.
   * Help fixes by Cerekk@bDv TrekMUSH, Julian@M*U*S*H, Letters@M*U*S*H,
     and Philip Mak.
   * The wildcard matcher could lag the MUSH under unusual conditions.
     It's now smarter. Discovered by Sketch@M*U*S*H.
   * Fixes from 1.7.4p20
   * Fix a bug with setdiff() not using the output separator correctly. [SW]
   * convsecs() could attempt to use values larger than 2^31, which could
     crash Windows. Reported by Bellemore@M*U*S*H.
   * @config didn't correctly show default flags for objects.
     Reported by Vadiv@M*U*S*H.
   * The strcasecoll function was poorly coded, and is now fixed.
   * Created players who hadn't yet logged in didn't have LASTIP set
     properly. Reported by Philip Mak.

& 1.7.5p9
Version 1.7.5 patchlevel 9                     July 16, 2002

Minor Changes:
   * /noeval switch added to @wall/@rwall/@wizwall and variants.
     Suggested by Philip Mak.
Fixes:
   * Added a missing space in the @function report for softcoded
     @functions. [SW]
   * MUX-style @function foo=obj/attr works right. [SW]
   * Cleaned up some multiple includes of the same header files. [SW]
   * Lots of cleanup of old _() macros and similar by Vadiv@M*U*S*H.
   * Added help for @stats/table. Suggested by Intrevis@M*U*S*H.
   * Fixes to csrimalloc #ifdefs that broke in last patchlevel. [SW]
   * A typo that could crash @function on certain operating systems
     has been fixed. Report by Jeff Heinen.
   * Improved switch() help. [SW]
   * Changes in the way switchinc.c is generated, to reduce the number
     of patches that attempt to patch it due to indentation changes. [SW]

& 1.7.5p8
Version 1.7.5 patchlevel 8                     June 26, 2002

Minor Changes:
  * Added @nspemit and nspemit(). Wizard-only versions of @pemit and
    pemit() that don't print nospoof information. Suggested by many people,
    most recently Mike Griffiths and Nymeria@M*U*S*H. [SW]
  * Help updates. [SW]
  * Force the pipes to compression program for database reads and saves to be
    block-buffered. [SW]
  * @function name=obj/attrib now works, as well as
    @function name=obj,attrib [TAP]
  * The AF_PREFIXMATCH flag is no longer shown on attributes it's set
    on when you examine them.
Fixes:
  * A bunch of internal code cleanup, especially around casts. [SW]
  * The disconnected room check is skipped on GOING rooms. Suggested
    by Philip Mak.
  * The dbck check for nameless rooms was only checking disconnected
    rooms; now it checks all rooms.
  * hasflag() did not work with single-character flag abbreviations.
    Report by Mystery8.
  * The variable named 'template' in src/strutil.c has been renamed
    to avoid clashes with the C++ reserved word. Suggested by Mac@M*U*S*H.
  * Improvement to help @filter. Suggested by Philip Mak. [SW]
  * Files in the patches directory ending in ~ are ignored
    when patches.h is rebuilt. [SW]
  * Removed a // comment from strutil.c, as we're still
    just following the c89 standard, not c99. Report by
    Vadiv@M*U*S*H. [SW]
  * make indent now indents the .dst files before the .c ones.
    Fixes some spurious warnings from later makes. Suggested by
    Vadiv@M*U*S*H. [SW]
  * Code cleanup, mostly tprintf() and unneeded header file
    checking elimination. [SW]
  * Since a Windows header #defines OPAQUE, which conflicts with a
    #define for the mush flag of the same name, rename
    our #define rather than #undefining the Windows one. [SW]
  * Fixes from 1.7.4p19


& 1.7.5p7
Version 1.7.5 patchlevel 7                     May 14, 2002

Utilities:
  * 'make globalinstall' will install executables, scripts, and
    a game/ directory structure in a global location (/usr/libexec/pennmush
    by default). Facilitates rpm builds. By Vadiv@M*U*S*H.
  * The utils/ln-dir.sh script can be used to clone a globalinstall'd
    pennmush for an individual MUSH/user. In combination, these two
    are a replacement for 'make customize', especially for mud hosters.
    By Vadiv@M*U*S*H.
  * You can now configure options.h settings from the command line
    using: make DEFINE="OPTION OPTION=value" UNDEFINE="OPTION" update
    This will mostly be useful for autoinstallers and packaging scripts.
    Suggested by Vadiv@M*U*S*H.
Minor Changes:
  * The default gcc compile flags now include some extra warnings.
  * The prefix-table code now only aliases down to unique prefixes.
    This prevents @w from calling @wipe (reported by Philip Mak),
    and means that you'll need to use alias.cnf to get some of those
    short aliases. [SW]
  * Attribute lookups only do prefix-matching on attributes with the
    AF_PREFIXMATCH flag. Most standard atr_tab.h attributes have this
    flag, but newly added @attributes won't. Solves a problem with
    inadvertant prefix-matching of @attribs reported by Sam Knowlton.
Fixes:
  * Fixes from 1.7.4p18
  * @decomp/skipdefaults skips @lsets of default lock flags.
    Suggested by Oriens@Alexandria. [SW]
  * Typo in src/bsd.c corrected. Reported by Nymeria@M*U*S*H.
  * Missing prototype in src/help.c. Reported by Nymeria@M*U*S*H.
  * A bunch of linting.
  * Win32 portability fixes. [EEH]
  * Updated MSVC++ project files for win32. [EEH]
  * @newpassword = foo would change the password of an arbitrary player.
    This is now corrected. Report by Oriens@Alexandria.

& 1.7.5p6
Version 1.7.5 patchlevel 6                     April 22, 2002

Config:
  * New attribute_alias config directive, and some default attribute
    aliases added to alias.cnf. Based on a report from Hilikiradi.
Functions:
  * textfile() returns help/news/etc. entries. Suggested by Trispis@M*U*S*H.
Minor changes:
  * New @warnings type lock-checks that reports problems with @locks. [SW]
  * exit-unlinked checks do some sanity checks on variable exits. [SW]
  * Improved error-checking in evaluation of @locks. [SW]
  * No more hdrs/warnings.h file. [SW]
  * New @nameaccent attribute to add accent marks to object
    names in speech and things like look. Idea from Elendor. [SW]
  * accent() understands a few more things. [SW]
  * The accented characters->html entities table and other
    lookup tables are now in a seperate file, src/tables.c,
    which can be regenerated if needed by utils/gentables.c [SW]
  * Improvements in caching of cached text files. [SW]
Fixes:
  * Buglet in ansi display of high-bit characters fixed. Report by
    Trispis@M*U*S*H. [SW]
  * Improved @clock2 help by Linda Antonsson.
  * Fixes from 1.7.4p17
  * A truly perverse database could cause an infinite loop on load. [TAP]
  * Win32 portability fixes. [NJG, EEH]
  * The notify code assumed that integers could be directly stored in
    pointers. This isn't always true. [SW]
  * Removed some un-used code. [SW]
  * Fixed some compiler warnings and general code cleanup. [SW]
  * Changed signal handlers to always use the ANSI/ISO C form (Returning
    void, basically) [SW]
  * A null string no longer prefix-matches anything. Report by Prot Diryn
    and Cheetah@M*U*S*H.
  * @sitelock/remove could remove entries it shouldn't if you remove the first
    one after the '@sitelock will add sites...' line. Reported by
    Ambrosia@M*U*S*H. [SW]
  * The last line of the access.cnf file sometimes wouldn't get read
    properly. [SW]


& 1.7.5p5
Version 1.7.5 patchlevel 5                     March 11, 2002

Commands:
  * @notify and @drain now accept a new switch /any. [TAP]
  * Added @remit/list. Suggested by Tareldin@M*U*S*H [SW]
Minor changes:
  * We now use the Mersenne Twister pseudo-random number generator,
    which is better that that available in most C libraries.
    Moreover, we seed with /dev/urandom, if it's available. [SW]
  * The 'T' type character (for THING) is now shown when one-character
    flag lists are displayed. This is more consistent with other types,
    and makes it harder to confuse #23O (#23, opaque) with #230
    (#230, no flags). Suggested by Eratl@M*U*S*H.
  * @lock/use on a parent used to apply to attempts to use $commands on
    a child. This is no longer necessary, given inheritable locks,
    so the behavior has been changed. Parents' locks are no longer checked
    when deciding if a $command inherited from the parent should be run
    via a child.
  * New 'call_limit' config option can limit the number of recursive
    parser calls to control process stack size and avoid crashes
    on systems with limited stack. Defaults to unlimited, however, because
    setting this value too small breaks mushcode. Report by Bellemore
    and BladedThoth @ M*U*S*H.
Fixes:
  * Code cleanup - some stuff from 1.7.4 got left in that isn't
    used in 1.7.5 any more. [SW]
  * Fixes from 1.7.4p16, notably an important fix for timed semaphores.
  * Cygwin portability fixes. [NJG]
  * Updated MSVC++ project files. [EEH]


& 1.7.5p4
Version 1.7.5 patchlevel 4                     February 15, 2002

Major changes:
  * The mush recognizes telnet-aware connections. This is
    neccessary for properly sending them some 8-bit characters. [SW]
  * Much more support for handling accented characters in the ISO 8859-1
    character set. See help for accent(), stripaccents(), and NOACCENTS.
    Inspired by Elendor. [SW]
  * Things that do first-unique-prefix matching (command, attribute and flag
    names) now use a more space-efficient data structure than before.
    This adds two new files, src/ptab.c and hdrs/ptab.h [SW]
Commands:
  * @sitelock/remove removes a sitelock entry. [SW]
Functions:
  * ord() and chr() functions for converting characters to/from numerical
    values that represent them. [SW]
Minor changes:
  * The useless FORCE_WHITE flag is really, truely, gone. [SW]
  * Use the new arglens argument to functions in more places. [SW]
  * capstr() and before() fixes reimplemented using arglens. [SW]
  * We now use the Mersenne Twister PRNG algorithm. [SW]
Fixes:
  * setunion() no longer eats empty list elements. [SW]
  * Setting an inherited lock on a child could change the parent's lock.
    Reported by Riverwolf. [SW]
  * Help fixes. [SW, Nymeria]
  * Players waiting at the connect screen weren't being disconnected
    by the idle_timeout.
  * Detection of cygwin in Configure may be improved.
  * Fixes from 1.7.4p15.

& 1.7.5p3
Version 1.7.5 patchlevel 3                     January 24, 2002

Fixes:
  * before() was broken in 1.7.5p2. Reported by Sam Knowlton.
  * capstr() was broken in 1.7.5p2.
  * Win32 portability fixes by Noltar@Korongil.

& 1.7.5p2
Version 1.7.5 patchlevel 2                     January 23, 2002

Major changes:
  * Implementations for softcode functions get the lengths of their arguments
    passed to them, and this is taken advantage of in a number of places. [SW]
Minor changes:
  * It's harder to get a partial dbref because of end-of-buffer truncation. [SW]
  * Code cleanup. In particular, safe_str() and friends are no longer
    macros for a safe_copy_str() or the like, because hardly anything
    used a different buffer length than BUFFER_LEN, and those places
    can be handled other ways. [SW]
Fixes:
  * Win32 portability fixes by Noltar@Korongil and Eric Koske.
  * When you have two hidden connections, one idle over the inactivity limit,
    and the other not, @hide/off on the active connection unhides both,
    but you also see the Inactivity re-hide message from the other
    connection. Reported by Trispis.
  * iname() function actually added to function table so it works.
    Reported by K. Shirow.
  * @lock obj=attrib:value locks didn't work properly. Reported by
    Linda Antonsson.
  * Fixes from 1.7.4p14.

& 1.7.5p1
Version 1.7.5 patchlevel 1                     December 3, 2001

Minor Changes:
  * PCRE updated to 3.7. [SW]
  * player_name_len is now runtime configurable. Suggested by
    Linda Antonsson. [SW]
  * Any object of any type may be a ZMO, and any object of any type
    may be zoned to a ZMO of any type. However, searching for
    $commands has not changed, so $commands on a ZMO are only
    searched when the ZMO is not a room, and $commands on objects
    within the ZMO are only searched when the ZMO is a room. [TAP]
  * @chzoneall nows directly calls @chzone, and @chzone now tells
    you when it's not changing a zone. [TAP]
  * The term "Zone Master" (player) has been replaced by "Shared
    Player" in the help. [TAP]
  * Many obsolete db formats are no longer readable. hdrs/oldattrib.h
    and src/convdb.c are no more. [SW]
  * Code cleanup. [SW]
Fixes:
  * Help file for mix updated. Report by Cmintrnt@M*U*S*H
  * Updated win32 config.h file and other fixes by Noltar@Korongil
  * WHO wasn't showing unconnected players. Report by Noltar@Korongil. [SW]
  * Help fixes. [SW]

& 1.7.5p0
Version 1.7.5 patchlevel 0                     November 14, 2001

Major Changes:
  * This is now the development minor version. This first release includes
    relatively few changes, to make converting to it easier.
  * Internal changes to the lock system. This requires a new minimal.db,
    which is now distributed. [SW]
  * Locale-based string collation throughout.
  * Only ANSI C compilers are still supported; no more K&R. Files are
    gradually going to be converted to ANSI C only.
  * There is now an option to make ZMOs and ZMRs not count for
    control of objects, only ZMPs. [SW]
Flags:
  * The ZONE player flag has been renamed SHARED, to help seperate the
    ZMP control-only meaning from the command-matching of ZMOs and ZMRs. [SW]
Commands:
  * /preserve switch for @link prevents @chowning. Suggested by Vexon@M*U*S*H
  * Admin WHO and SESSION now includes unconnected descriptors. [SW]
  * Unconnected descriptors can now be booted. Patch by Bellemore@M*U*S*H.
  * Unconnected descriptors can now be paged by admin with page/port. [SW]
Functions:
  * mix() can take more than 10 lists and of unequal length. [3,SW]
  * iname() returns the name of an object from inside (honoring nameformat)
    Idea by Jeffrey@TheHotel.
  * lplayers() returns a list of players in the location. Handy for
    room parents. By Vexon@M*U*S*H.
  * lvplayers(), lvcon(), lvexits() are like lplayers/lcon/lexits, but
    leave out dark things (and disconnected players). Handy for room
    parents. By Vexon@M*U*S*H.
Minor Changes:
  * munge() now passes its delimiter as %1 to make generic sorting easier. [SW]
  * Word-based attribute compression is faster than before, for both
    compression and decompression. [SW]
  * Windows memory-usage information for wizards is now in @uptime, not
    @stats [SW]
  * Word-based attribute compression stats can be viewed on non-Windows
    mushes as well, by defining COMP_STATS. See externs.h for details. [SW]
  * Setting of the internal QUEUE and semaphore attributes does not modify
    an object's last-modified timestamp. [SW]
  * Speaking on a channel that you're gagging is now treated like
    speaking on a channel that you're not on. Suggested by rodregis@M*U*S*H
  * You can use @exitto in place of &DESTINATION to set the destinatino
    for variable exits, though DESTINATION is checked first. [3]
  * WATCHER is another name for the MONITOR flag. [3]
  * max_guest_pennies and guest_paycheck config options. Inspired by [SW]
  * Lock and unlock messages now show object name and dbref, and tell
    you if you unlock an already unlocked object. Suggested by Jamie Warren.
  * A version of portmsg for Win32 is in the win32 directory.
    Donated by CU5@WCX
  * Tweaks to info_slave, which now uses readv/writev. [SW]
  * Lots of code cleanup. [SW]
  * CHAT_SYSTEM, INFO_SLAVE, and FUNCTION_SIDE_EFFECTS are now #define'd
    by default. [TAP]
Fixes:
  * Indentation fixes [SW]
  * Fixes up to 1.7.4p12 merged in.

& 1.7.3p14
Version 1.7.3 patchlevel 14                    January 29, 2001

Major Changes:
      * Commands and functions can now be aliased to other names
        in mush.cnf, so you can provide translated command names
        as well as the english one, etc. Suggested at various times
        by Krad@M*U*S*H and David@M*U*S*H. New file aliases.cnf
        in game/ is created to put these command_alias and function_alias
        directives (as well as reserve_alias). [SW]
Minor Changes:
      * smalloc and bigram compression options are no longer supported. [SW]
      * Internal improvements to @search/lsearch, which are now more
        consistent with one another. [SW]
      * mush.cnf options that refer to dbrefs now understand #<number> as 
        well as just <number>. They are also formatted as dbrefs in @config 
        and config(). [SW]
      * Much longer game/names.cnf file contributed by Kyieren@M*U*S*H.
      * New internal function notify_format() to replace notify+tprintf
        more safely. [SW]
      * Tweaks to network activity timeout code. [SW]
      * @stat and lstats no longer needs to scan the entire database. [SW]
Commands:
      * @switch and @select can now take a /notify switch, like @dolist.
      * Players may @chown by dbref, but they must still be carrying
        the object if it's a thing. Suggested by Kyieren@M*U*S*H.
      * @clone can now clone rooms. Suggested by Kyieren@M*U*S*H.
      * @verb's matching of the <actor> argument has been relaxed so
        non-privileged objects can use it on remote actors, if the normal
        permission checks succeed. This makes @verb much more useful for zones
        and master room objects. [SW]
Attributes:
      * @forwardlist [2.2,SW]
Functions:
      * itemize() takes a list "a b c" and produces "a, b, and c" and 
        similar tricks. Also callable as elist() for Rhost compatibility.
      * ilev() returns the current iter nesting level. [Rhost,SW]
Fixes:
      * When indexing help files, ones that aren't in the right format
        weren't being properly closed. Report by Nammyung@M*U*S*H. [SW]
      * We're much more forgiving about help files that start with
        blank lines now.
      * Help updates by Kyieren@M*U*S*H, [SW]
      * Games w/o MAIL_ALIAS couldn't load maildbs that had mail aliases.
        Reported by Nymeria. [SW]
      * max_pennies had a limit of 10,000 in conf.c, even though it
        has always defaulted to 100,000. Reported by Intrevis@M*U*S*H.
      * src/filecopy.c didn't include hdrs/log.h. Fixed by Noltar@Korongil.
      * MacOS portability fixes. [DW]
      * vsnprintf used in place of vsprintf everywhere when available. [SW]
      * Cleanup of @atrlock code. [SW]
      * '#' without any trailing numbers was treated as #0 when used as a 
         dbref. [SW]
      * Added explicit checking for lower-case letters in good_atr_name(). [SW]
      * Trying to set an attribute with a bad name now gives a better 
        error message. [SW] 
      * Fix to potential overflow bug in revwords. [SW]
      * Fix to potential overflow bug in @grep. [SW]
      * Configure checks for snprintf. Systems unfortunate enough not to
        have this (Solaris 2.5.1, for example) are stuck with sprintf.
        Report by Broncalo@DuneIII.
      * CHARGES were decremented whenever an A-attribute would be 
        executed, *even if the attribute wasn't set on the object*.
        Reported by Kyieren@M*U*S*H.

& 1.7.3p13
Version 1.7.3 patchlevel 13                    January 9, 2001

Major Changes:
      * Semaphores may use attributes other than SEMAPHORE. These 
        "named semaphores" make it easier to have multiple semaphores
        waiting on the same object. [SW]
      * New attribute flag AF_NODUMP prevents attributes from being
        dumped to the db. It applies to QUEUE, SEMAPHORE, and attributes
        used as named SEMAPHORES. [SW]
Commands:
      * @wait/until can be used to put commands on the wait queue until
        some absolute time (in secs) is reached. [SW]
      * @cpattr/noflagcopy copies attribute data without flags.
        Same for @mvattr. Suggested by Noltar@Korongil.
Functions:
      * foreach() takes start and end arguments like TM3/MUX2. [3,SW]
      * locate() has a new option to force matching the preferred type, 
        and an undocumented option to eliminate ambiguous matching is now
        documented. [SW] 
Minor Changes:
      * Experimental support for translating 8-bit accented characters to HTML
        entities for Pueblo. [SW]
      * Objects without a @lock/zone that are used as zones are noticed and 
        warned about during dbcks. [SW]
      * Some people prefer that +channel "foo now cause you to say "foo 
        on the channel, instead of stripping the initial quote. Now
        it's a mush.cnf option (chat_strip_quote). Suggested by Dave Milford.
      * isint() now ignores tiny_math, so isint(foo) will always return 0. [SW] 
Fixes:
      * Hopefully fixed a problem with puppets doing look for non-Pueblo
        players with Pueblo support turned on. The line after the look
        could appear to come from the puppet even if it didn't. [SW]
      * If you disabled a command with a one-character token (like say),
        then running the command with the token ("hi!) would fail, but 
        wouldn't return the right thing for $command matching. Now it
        returns the canoncalized raw command (SAY hi!) so you can trap
        it in softcode. Reported by Mackenzie@SWGT Mush  
      * General linting [SW]
      * Help fixes by Eratl@M*U*S*H.
      * make customize doesn't try to link mkindx any more. And README and
        os2/Makefile don't refer to it either. By Bobby Bailey (Chil@M*U*S*H).
      * The internal tprintf() function is safer. [SW]
      * Crash bug in @edit fixed, and @edit code is cleaned up. [SW] 
      * max_pennies documented in mush.cnf. Noted by Oriens@Alexandria
      * cmdlocal.dst now includes cmds.h. Reported by David@M*U*S*H.


& 1.7.3p12
Version 1.7.3 patchlevel 12                    January 4, 2001

Locks:
      * A new @lock/chzone, set on a ZMO, controls who may @chzone
        objects to the ZMO. This can simplify multi-player building
        using ZMOs. Suggested by David@M*U*S*H
Commands:
      * @wcheck/me checks all of a player's objects for them.
Functions:
      * cflags() function gets channel flags.
      * ctitle() gets channel title for an object. Suggested by Luke@M*U*S*H.
      * strinsert() function does insert() on strings. Suggested by
        Reagan@M*U*S*H. [SW]
      * channels() on an object you can't examine now shows you channels 
        that you have in common with it. Suggested by Trispis@M*U*S*H
Minor changes:
      * Runaway objects are now logged, along with the command that
        pushed them over the edge. Suggested by Trispis@M*U*S*H.
      * All instances of fprintf(stderr,...) after logging is started
        are now handled through do_rawlog(LT_ERR,...). By David@M*U*S*H.
      * @atrchown works more reasonably. [SW]
      * @lock/link on an unlinked exit restricts who may link it.
      * Everyone (even mortals) sees object names at the top of
        their descriptions when they look at them. Suggested by Jeff
        Ferrell most recently.
      * New reserve_alias mush.cnf directive makes run-time command
        alias reservation possible. Suggested by Jeff Ferrell.
      * Mortals may use @command to get info about commands. Suggested by
        Chili@M*U*S*H.
      * Messages logged during help file indexing distinguish indexing
        of admin topics. Suggested by mith@M*U*S*H
Fixes:
      * Help fixes by [SW], Jeff Ferrell, mith@M*U*S*H, Mirth@AtheneuMUSH.
      * Help update to @cpattr based on behavior noted by Noltar@Korongil.
      * cwho and @chan/who behave better with hidden (@hide) players.
        Reported by Reagan@M*U*S*H.
      * MUSHes with no @functions crashed on @list calls due to a 
        problem with the hashtable code. Reported by Whiskey. [SW]
      * A bug in handling of errors under debug in process_expression
        was reported by Reagan@M*U*S*H. [SW]
      * Rare memory leak in process_expression fixed. [SW] 
      * Inconsistencies in the handling of destroyed objects/players
        and their locations fixed. [SW]
      * The QUEUE attribute was not properly cleared on restart
        for non-player objects. It was buggy in other ways, too. [SW]
      * The AF_SAFE attribute flag couldn't be reset. Reported by
        Pegasus@StarQuest.
      * @teleporting into garbage could cause crashes. Reported by Howie
      * The help_command and ahelp_command directives now look for
        whitespace generally, not spaces specifically. 
        Suggested by Krad@M*U*S*H
      * SIGHUP once again re-reads the config file. [SW]
      * If an exit @created an object, that object would be inside the exit 
        until the next dbck. Now it is created in the exit's source room. [SW]
      * Turning the lowest possible integer number into a string could 
        result in garbage output. [SW]
      * Solaris needed arpa/nameser.h before resolv.h in mysocket.c

& 1.7.3p11
Version 1.7.3 patchlevel 11                    December 4, 2000

Minor changes:
      * Added 'comsys' as help alias for 'chat'. Suggested by David@M*U*S*H
      * New win32 project files and MSVC build instructions by Jenny Lind.
Fixes:
      * Improved test for non-broken getdate and getnameinfo.
      * Loading panic dumps does better on chatdb. By Maverick@M*U*S*H
      * You may leave a channel even if you're the wrong type
        to get onto it. Suggested by Cheetah@M*U*S*H.
      * Typo in the win32 strcasecmp code fixed [NJG]
      * stddev's algorithm improved. [TAP]
      * If the go command is restricted, other commands produce spurious
        errors during the exit-matching phase of command parsing.
        Reported by Jamie@M*U*S*H

& 1.7.3p10
Version 1.7.3 patchlevel 10                    November 20, 2000

Major Changes:
      * Improved detection of errors saving the game. If any problems 
        are encountered, the save is aborted, and online admins notified so
        they can fix the problem before finding out about it too late. [SW] 
Flags:
      * The INHERIT flag has been renamed TRUST, which better describes
        its function. INHERIT remains as an alias.
Commands:
      * @chan now takes /ungag, /unhide, and /unmute as well as the
        usual @chan/gag <channel>=no. By David@M*U*S*H.
Minor Changes:
      * money() called on a no_pay player returns the value of
        MAX_PENNIES to ease softcode checks. Suggested by Oriens@Alexandria.
      * Removed help and &help entries from the distributed pennmush.nws
        because people will generally want to override them anyway
        and we shouldn't introduce problems. Suggested by Jeff Heinen.
      * safe_str and friends optimize trivial 0 and 1 letter strings. [SW]
      * A version of word-based compression that's almost 8-bit clean
        is now included. [SW]
      * We now use stricmp and friends for strcasecmp and friends on
        Win32, rather than roll our own. [SW]
Fixes:
      * @mail aliases couldn't be used by players who didn't have
        permissions to see the alias members, which is wrong.
        Fixed now. Report by Grinna@M*U*S*H.
      * lnum(1) and lnum(0,0) were broken. Report by Jeff Ferrell 
      * Help updates. [SW]
      * @set obj/notanattribute=flag now returns a 'No such attribute' error.
        Reported by David@M*U*S*H. [SW]
      * Help file indexing tries to detect files that aren't in the right 
        format. [SW]
      * function restrictions were checking the wrong object. [SW] 
      * objmem and playermem counted eval-locks and atr-locks incorrectly. 
        Reported by Javin@DynamixMUSH. [SW]
      * Fixes to win32 NT_TCP stuff. [NJG]
      * Rare memory leak in do_page fixed by David@M*U*S*H. 

& 1.7.3p9
Version 1.7.3 patchlevel 9                    November 20, 2000

Major Changes:
      * Help files and their associated commands are now defined with
        the 'help_command' (or 'ahelp_command') directive 
        in mush.cnf. So you can translate the help to french and
        add an "aidez-moi" command if you like. [SW]
      * Help file indexes are now kept in memory and built by the
        server. The mkindx program is no longer used. [SW]
      * Added restrict_function and @function/restrict, like the versions 
        for commands. [SW]
      * User @functions can now override built-in functions, if you
        @function/delete the built-in first. You can also @function/restore
        the built-in back. [SW]
Attributes:
      * @[oa]zenter and @[oa]zleave on ZMOs are triggered when someone
        enters or leaves a given zone. Motion between rooms in the same
        zone doesn't trigger these. "Zone" is based on the mover's
        absolute room (outermost container) so that entering and leaving
        an unzoned object in a zoned room doesn't trigger these either.
        Suggested by Michael Kurtz.
Commands:
      * New /silent switch for @teleport without @[o|a|ox]tport msgs.
Minor Changes:
      * Still less allocation involved in outputting text to connections. [SW]
      * @scan has better output when multiple attribs match. [SW]
      * Added internal absolute_room function for use by fun_room
        and move.c and wiz.c, etc.
      * MEM_CHECK now uses a sorted linked list and is faster. [SW]
Fixes:
      * References to kill_timer removed from win32 sections. [SW]
      * conf.c reports error via logging routines, not fprintf. [SW]
      * Assorted minor bug and warning fixes. [SW]
      * Fix to example in help regedit by Amberyl.
      * @wait and other timing functions were broken under win32.
        Fixed now. [LdW]


& 1.7.3p8
Version 1.7.3 patchlevel 8                    November 12, 2000

Major Changes:
      * Objects' names are stored in a string tree like attributes, so
        we don't have hundreds of copies of 'West <W>;west;w' and such
        taking up memory. Attribute name "hash table" is now a strtree. [SW]
      * We no longer use alarm() to know when to run stuff on the queue. [SW]
      * @shutdown/reboot is now supported on Windows builds. This is
        slightly experimental. By Revian.
Minor Changes:
      * %qa-%qz now operate as global registers like %q0-%q9. 
        Suggested by Trispis@M*U*S*H and probably others.
      * Hashtable lookups are faster (collision chains are sorted) [SW]
      * @uptime/mortal suppresses the extra process information [SW]
      * Wizard @uptime prints better process information on linux. [SW]
      * @listen, @filter and @infilter respect the REGEXP and CASE attribute 
        flags.  Suggested by Maestro@M*U*S*H [SW]
      * Having many @waits or semaphores is more efficient, because we
        sort those queues by time and we stop looking sooner. [SW]
      * User-defined lock names must follow the same rules as attribute 
        names. The name part of attrib and eval locks have to also. [SW]
      * @chan/title's confirmation message is nicer. [SW]
      * Minor optimizations related to strcpy() and malloc() overhead. [SW]
      * safe_format uses vsnprintf if your system has it. By Luke@M*U*S*H.
      * replace_string is safer. By Luke@M*U*S*H.
Fixes:
      * iter() is smarter about quitting when the function invocation
        limit is reached or the buffer is filled. [TAP]
      * lnum() has been greatly sped up. [TAP]
      * RWHO references removed from game/mushcnf.dst, game/restart,
        etc. by mith@M*U*S*H.
      * Fix to help filter by Revian.
      * COMPRESSION_TYPE 0 didn't compile. Report by David@M*U*S*H.
      * Clarification of @lock/teleport in help @elock by Envinyatar@M*U*S*H
      * Compiling w/o MAIL_ALIASES didn't declare load_maliases.
        Reported by Envinyatar@M*U*S*H
      * clone() was stomping %0-%9. Report by Revian.
      * @dol with an empty list now does the right thing (nothing)
        instead of running the command once. Report by Linda Naughton [SW]
      * spname cleanup by mith@M*U*S*H.
      * Fixed a bug in @function function-name [SW]
      * make update should finally handle CHAT_TOKEN_ALIAS right.
        It's also smarter with mush.cnf
      * isword() on a null string now returns 0. Suggested by Ashen-Shugar.
      * channels(object) returns a better error when object isn't matched.
        Suggested by Trispis.
      * Fix to help rand() to reflect actual error return value. Reported
        by Philip Mak.
      * More translated strings noted by Krad.
      * Problems with encrypt()'s logic fixed by Ashen-Shugar. [Rhost]
      * Other encrypt() sillyness fixed by Brazil.
      * Potential crashers around DEBUG and other buffer overruns
        have been fixed. Report by Tajan and Rimnar. [SW]
      * notify_anything allocates less memory. [SW]
      * Fixed mistagged memcheck "restart.descriptor". 
      * MacOS portability changes. Should build on MacOS X public beta
        (Darwin) systems nearly straightaway. [DW]
      * Restart script test for already-running MUSH condensed to one
        line. Suggested most recently by Cory Albrecht.
      * Serious crash bug in page fixed. Reported by Revian.
      * Win32 bugs fixed by Luke@M*U*S*H: problems with dumping
        compression suffixes, problems with @uptime
      * MUSH no longer crashes if a player alias is > 32 chars in length.
        It truncates names that are too long instead. By Luke@M*U*S*H.
      * We don't check AF_PRIVATE attributes for $/^commands on children.
        By Luke@M*U*S*H.
      * Under win32, the MUSH would often start ignoring commands from
        players after the first 98 per connection. Fixed by Revian.
        
& 1.7.3p7
Version 1.7.3 patchlevel 7                    October 12, 2000

Functions:
      * filterbool(), for TM3 compatibility. Like filter(),
        but tests for any true value, not just 1. [3,SW]
      * case(), for TM3 compatibility, and caseall().  Like switch() 
        and switchall(), but does an exact match, not wildcard. [3,SW]
      * valid() takes more categories. [SW]
      * localize(), for TM3 compatibility. Like a cross between
        s() and ulocal(). [3,SW]
Commands:
      * @break, for Rhost compatibility. Stops processing the
        current action list. [Rhost,SW]
      * @enable and @disable can be used on any boolean config option. [SW]
      * @function/enable and @function/disable for built-ins
      * @function function-name reports some information on the function,
        like @command command-name.
Flags:
      * New attribute flag 'safe' prevents accidental modification.
        Suggested by Stephen Viscido. [TAP]
Minor Changes:
      * The daytime config option is no more. Do a few @searches in
        its honor. [SW]
      * lsearch() permission is controlled by @search, and entrances()
        by @entrances, for consistency with other functions that have
        a corresponding command. [SW]
      * The number of reboots is tracked, and the restarts() function
        added, for TM3 compatibility. [3,SW]
      * Rearranged some compile flags to suit systems that have
        /usr/local/include/ident.h. By Luiz Claudio Duarte.
      * More strings marked for translation. By Krad@M*U*S*H
      * :, [, ], (, and ) are no longer legal in attribute names
        due to ambiguities and security issues. [TAP,SW]
      * Ranges in @search, lsearch() and @find can be either #dbrefs or 
        (for backwards compatibility), integers. Inspired by ElendorMUSH. [SW]
      * Broadcast messages in bsd.c replaced with GAME prefix.
        Suggested by Krad@M*U*S*H.
Fixes:
      * Fixed a bug in filter() where it only looked
        at the first character of the evaluated attribute. [SW]
      * Some more noise from info_slave was removed. [SW]
      * do_pcreate and do_chownall now live in game.h and not
        externs.h. Reported by Maestro@M*U*S*H.
      * Clean-up of atr_add calls in void context. [TAP]
      * IPv6 buglet fixed. Report by Vexon@M*U*S*H. [SW]
      * @config/set can no longer be used to set options in the files   
        and messages categories, as this has icky consequences. [SW]
      * Fixed a logic bug in letters_to_privs where not all the letters 
        were being turned into privs properly. Report by Bolt@M*U*S*H [SW]
      * Fix to isint() so that isint(1a) is 0. [SW]
      * Added safe_boolean internal function, and fixed a hang bug
        in edit() reported by Walker@M*U*S*H. [SW]
      * Fixed problems in panic dumps/reads of maildb and chatdb. [SW]
      * @edit is a bit more efficient. [SW]
      * Assorted lock structures are allocated in big chunks like 
        attribute structures, to save malloc overhead. [SW]
      * User-defined lock names are stored in the attribute name tree. [SW]
      * Various help fixes [SW, Javelin]
      * LASTLOGOUT time now forces two-digit day for convtime niceness. [SW]
      * Very large malias names or member lists could cause buffer 
        overruns. [SW]
      * Buffer overrun fix, fix to str_chr. [TAP]
      * tprintfs removed from DEBUG output so DEBUG doesn't mess up
        messages in ^-commands anymore. [TAP]

& 1.7.3p6
Version 1.7.3 patchlevel 6                    September 20, 2000

Minor Changes:
      * Translation files are now archived separately on the ftp site.
      * A variety of options.h settings have been removed.
        EXTENDED_ANSI, DUMP_EMPTY_ATTRS, DUMP_LESS_GARBAGE and the *_LOCK 
        defines are totally gone. [SW]
        OLD_NEWLINES, DELETE_ATTRS and VISIBLE_EMPTY_ATTRS have been 
        moved out of options.h as they're special-purpose. [SW]
      * More common function error messages were made into variables 
        rather than being hardcoded in as string literals. [SW]
      * If a player is set HALT, their queued commands will not run.
      * Speedup in process_expression. [TAP].
Functions:
      * The regedit(?:all)?i? family of functions, like perl's s///. [SW]
      * Case-insenstive versions of regrab() and regraball(). [SW]
      * etimefmt(), which is to timestring() as timefmt() is to time(). [SW]
Fixes:
      * Error messages that were already variables are now translated. [SW]
      * Fixes to various metaconfig rules. [SW]
      * Open_Anywhere and Link_Anywhere were sharing the same
        bitmask. Fixed. [SW]
      * You can escape : in $command patterns that are being regexp-
        matched now. [SW]
      * Rewrites of the regexp functions so that, say, regrab() and
        regraball() point to the same actual code, using called_as to 
        know when to stop. They also use PCRE's match optimizing 
        pcre_study() function when appropriate. [SW]
      * Buglets in game/restart and game/mushcnf.dst fixed.
        Reported by Krad and Nymeria at M*U*S*H.
      * page_aliases directive in mush.cnf works now. Report by Nymeria.
      * Same for float_precision. Report by Oleo@M*U*S*H.
      * mushtype.h now included in compress.c. [DW]
      * Less noise in log/netmush.log from failed ident queries.
      * More strings marked for translation.
      * Fixes to problems with @search reported by Oleo@M*U*S*H. 
      * Weird evaluation of functions in softcoded commands fixed. [TAP]
      * Cleanup of typos here and there by Padraic@M*U*S*H.


& 1.7.3p5
Version 1.7.3 patchlevel 5                    September 7, 2000

Minor Changes:
      * FLOATING_POINT is no longer an option (it's always on). [SW]
      * EXTENDED_ANSI defaults to enabled. [SW]
Attributes:
      * @receive/@oreceive/@areceive triggered on the recipient
        after a get or give, so you've got access to who caused
        you to acquire the object and the object's dbref now.
      * @give/@ogive/@agive triggered on the giver with object's
        dbref in %0. Suggested by Oriens@Alexandria. 
Fixes:
      * Fixes for systems with broken or incomplete IPv6 support. [SW]
      * Uses of index() changed to strchr() for consistency. [SW]
      * Much removal of duplicate function prototypes and rearranging
        of headers.  hdrs/globals.h is now hdrs/case.h. hdrs/intrface.h is 
        no more, and hdrs/boolexp.h, hdrs/log.h were added. [SW]
      * @search supports "quoted player names".
      * We no longer report failed connect to ident servers in the log.

& 1.7.3p4
Version 1.7.3 patchlevel 4                    August 8, 2000

Major Changes:
      * Internationalization:
        * Support for international time formats via LC_TIME locale [SW]
        * Support for message translation
        * Support for locale-sensitive ordering of strings (LC_COLLATE) [SW]
        To take advantage of the new features, you should have your
        LANG environment variable set to an appropriate locale 
        before you 'make install' (which will cause the right message
        catalog to be compiled), and you should see the section 
        in game/restart for setting it there (which will actually cause
        the server to use it).
      * IPv6 support [SW]
Commands:
      * @dolist/delim and @map/delim [SW]
      * @stats/tables [SW]
      * SESSION command displays session statistics (experimental) [SW]
Functions:
      * uldefault(), like udefault but saves registers like ulocal() [SW]
      * switchall(), for Tiny compatibility. [SW]
      * cemit() with an option to act like @cemit/noisy [SW]
      * vmin() and vmax(), for returning the min and max of each pair in two
        vectors. [SW]
      * utctime(), convutcsecs() for UTC/GMT time instead of server-local. [SW]
      * convtime() uses getdate() if present, along with a variety of templates
      * that it can accept. [SW]
      * timefmt() - like the strftime() C function. [SW]
      * pcreate() side effect function suggested by Adamas and Padraic@M*U*S*H
      * starttime() now returns the first startup time, and 
        restarttime() returns the time of the last @shutdown/reboot [SW]
Minor Changes:
      * +help is mentioned in help help. Suggested by Trispis@M*U*S*H.
      * include directive for config files, with an example moving all
        the restrict_command's to another file. [SW]
      * make indent runs expand, then indent, because indent doesn't seem to
        handle tabs very well. [SW]
      * index-files.pl sorts patchlevels correctly. Patch by Jeff
        Heinen.
      * LASTLOGOUT attribute records logout time, like LAST, but not
        visual. Suggested by Oriens@Alexandria, and others.
      * Internal cleanup by David@M*U*S*H. New @config category 'messages',
        no more OBJECT_ENDOWMENT or OBJECT_DEPOSIT macros, etc.
      * Internal functions safe_integer(), safe_number(), and safe_dbref()
        to replace safe_str(unparse_FOO(data), buff, bp) calls  [SW]
      * You can now @trigger an attribute containing a $command or
        ^listen and it'll work (skipping the $...: or ^...: parts).
        So you can now do this:
         &DO_WHO obj=$who *: @pemit %#=[u(who,%0)]
         &DO_+WHO obj=$+who *: @tr me/do_who=%0
        (But you can do this much more efficiently with regexp...)
Fixes:
      * table() is less CPU-intensive in extreme cases. [SW]
      * Hopefully, Configure now determines pagesize on FreeBSD.
        Method suggested by Matt Harris.
      * CHAT_TOKEN_ALIAS comment clarification by Oleo@M*U*S*H.
      * pcre regexp engine updated to version 3.4.
      * Typo in @chan/who fixed by Vexon@M*U*S*H.
      * @attribute/access won't modify AF_INTERNAL attributes now.
      * Additional win32 portability fixes. [NJG]
      * con() was buggy in a bad way. Fixed now.
      * Configure -d should now work on linux systems that don't have
        crypt libraries. Reports by mith and Inek@M*U*S*H.
      * Fix to Z_TEL on things.
      * Help fix to @lock5 by Datron@SW2.
Languages:
      * Swedish and Hungarian translations for most strings are
        included in this patchlevel.


& 1.7.3p3
Version 1.7.3 patchlevel 3                    July 12, 2000

Major Changes:
      * Restrictions to the 7-bit ascii charset have largely been removed
        except in attribute names, to help international users. [SW]
      * If available, we now use setlocale to support international
        charsets (and eventually other conventions, though this should
        be considered experimental). If you set your LC_CTYPE environment
        variable to, say, 'fr_FR', french-accented characters should work.
        Wide (multibyte) charsets are not supported.
Minor Changes:
      * Internal cleanup of page/whisper code by David@M*U*S*H.
      * New mush.cnf directive, page_aliases, for showing alias of
        paging player. Supported by code by David@M*U*S*H.
        Requested by many. A contrib version by Flame dates to 1996.
      * @chat on a non-existant channel returns an error message. [SW]
      * Two new CRYPT_SYSTEM options. One checks both SHS and crypt(3)
        for passwords, and saves them back using SHS. The other does 
        the same for plaintext passwords. These should encourage folks
        who currently use crypt(3) to make a painless move to SHS. [SW]
Commands:
      * @remit can take /silent and /noisy switches now. Suggested by
        Philip Mak.
      * @lemit and @emit can take /silent switch. [SW]
      * @config/set can set configuration parameters at runtime. [SW]
Functions:
      * The set algebra functions can be given a sort order for output. [SW]
Fixes:
      * CHAT_TOKEN_ALIAS could get defined w/o a character value.
        Added a better explanation of CHAT_TOKEN_ALIAS in options.h.dist.
        and fixed utils/update.pl to handle commented defines that take 
        values a bit better. Report by Nymeria@M*U*S*H.
      * You can no longer initiate following a disconnected player.
        Report by Dave@Galactic.
      * CHANGES for 1.7.1 and 1.7.0 were missing. Back now.
      * Typo in options.h.dist corrected. Report by Padraic@M*U*S*H.
      * Small Configure portability improvements.
      * Better handling of cases where the maildb has messages from
        dbrefs that are out of range (due to truncating a db to remove
        corruption, for example). Suggested by Ashen-Shugar.
      * We now check for sitelocked sites before asking info_slave to
        do ident lookups.
      * Many help clarifications. [SW]
      * linux Configure can use nm to find symbols, finally.
      * help locate() now includes the z flag.


& 1.7.3p2
Version 1.7.3 patchlevel 2                    June 3, 2000

Commands:
      * New @sitelock options to control access to god, wizards, admin
        by site. [SW]
      * @force can now take /noeval [SW]

Functions:
      * squish() can take a second argument to squish non-spaces. [SW]
      * div(), floordiv(), modulo(), and remainder(), a set of functions
        jointly adopted by MUSH and MUX servers for compatibility. [TAP]
      * @@() and null() functions suggested by [LdW].

Minor Changes:
      * @uptime now shows initial restart time, not just time since
        last reboot.
      * Each player now has a limit to the number of @mail messages
        in their inbox (folder 0), configurable in mush.cnf.
        Suggested by Edwin@M*U*S*H.

Fixes:
      * More linting and improved indenting [SW]
      * PARANOID works right for broadcast messages (like @cemit) now
        too. Report by Vexon@M*U*S*H.
      * You can no longer follow what you can't see.
      * CHAT_TOKEN_ALIAS info appears in options.h now. Report by 
        Rhysem@M*U*S*H.
      * Mac portability changes. [DW]
      * Disconnected players don't follow any more. Suggested by Don Burks.
      * Various fixes to better resist crashing due to attacks involving
        overwhelming connections. 
      * @mail/stats for all was broken. Fixed now.
      * Clearer message after failed @pemit. Suggested by Eratl@M*U*S*H
      * Destroyed things stop following/leading. Report by Ashen-Shugar.
      * follow didn't properly set up the followers as enactors.
        We no longer short-circuit process_command. Report by Moe@Chicago.

& 1.7.3p1
Version 1.7.3 patchlevel 1                    May 18, 2000

Commands:
      * @oemit now takes a list of players. Adapted from patch by Philip Mak.

Minor Changes:
      * Reconnecting is less spammy - we don't show motds again
        to players already connected. Suggested by Trispis@M*U*S*H.

Fixes:
      * Configure problem that resulted in weird compile failures on
        bind/accept in src/bsd.c fixed.
      * Further linting. [SW]
      * FreeBSD getrlimit problem diagnosed by [SW] is worked around.
      * Couldn't compile w/o FLOATING_POINTS defined. Fixed.
      * Fixed a few dependencies in the Makefiles to insure that
        hdrs/patches.h and hdrs/switches.h are rebuilt properly.
      * Indentation cleanup.
      * We now recognize egcs as if it were gcc 2, and set ccflags
        accordingly.
      * Increased size of some hash tables for performance. [SW]
      * Help fixes. [SW]
      * flags(obj/attrib) behaved badly unless attrib was CAPITALIZED.
        Fixed now. Reported by Vexon@M*U*S*H.

& 1.7.3p0
Version 1.7.3 patchlevel 0                    April 20, 2000

Major Changes:
      * If you create a 'patches' subdirectory and keep any user-contrib
        patches you apply in there, and if the patches are properly 
        formatted, i.e., they include these lines:
              # Patch name:
              # Patch version:
        your MUSH's @version and INFO output will report them.
        In addition to being helpful for you, this will help the
        developers when you send us a bug report including your 
        @version. [TN]
      * As @cemit doesn't override @chan/gag and allows 
        NOSPOOF notification, it basically now operates just like
        @pemit/list (you can protect yourself from spoofing, and you can
        silence it). Accordingly, the cemit power is no longer 
        necessary. It's now a runtime option.
      * @malias (@mailing lists) by Daniel Peters.
      * Attribute names are now stored in a single string tree,
        so we don't have thousands of copies of the string
        "FINGER_NOTE", etc., taking up memory. [TAP]
      * As a consequence of the attribute name tree, the STARTUP flag 
        is no longer needed, and will be automatically removed from
        dbs.
      * Attributes are now inserted in alphabetical order, which
        speeds lookup. [TAP]
      * Panic dumps now dump the maildb and chatdb, appended to the
        end of PANIC.db. The MUSH handles breaking them up on restart.
      * New link_anywhere power allows @link'ing to any destination.
      * Mortals may create VARIABLE exits. At the time the destination 
        is computed, the exit is check to see if it has permission to
        link there (i.e., the exit controls the destination or the
        exit is link_anywhere or the destination is link_ok).
        To keep old code from breaking, all existing variable exits are 
        given the link_anywhere power at first db read in this patch.
        Suggested by David@M*U*S*H.
      * The follow command is implemented!
      * Nested iter is now useful. The itext(n) function returns
        the value of ## for the nth innermost iteraction, where
        0 is the most inner, and inum(n) does the same for #@. [TN]
      * New regexp library, pcre, now allows perl 5.005 compatible
        regular expressions! Suggested by [SW].
      * Objects are now limited in the number of attributes that may
        be set on them. This prevents a DoS attack. Suggested by
        Ashen-Shugar.
      * Some more english-style matching (look my 2nd box). [TN]

Functions:
      * config() returns a list of config option names. 
        config(<option>) returns the value of a config option.
        (e.g. config(money_singular))
      * sort() now accepts an output delimiter, a la iter().
        Suggested by Jason Newquist.
      * channels() now accepts a delimiter. Suggested by Trispis@M*U*S*H.
      * money(<integer>) returns the name of the money, either singular
        or plural, depending on <integer>. Suggested by Trispis@M*U*S*H.
      * timestring() with a pad flag of 2 forces 2 digit numbers.
        Suggested by Trispis@M*U*S*H.
      * fmod() function returns floating point remainder on division.
        Written by Michael Thole.
      * brackets() function returns bracket counts for its unparsed
        argument. Handy for debugging. By Jason Wilcox.
      * edit() can take multiple find-replace pairs. By Chili@M*U*S*H.
      * clock() function by Ari@SpaceMUSH and Chili@M*U*S*H.
      * flags() function can show attribute flags as well. 
        Suggested by Kami@SW2
      * mailstats(), mailfstats(), and maildstats() added by Kami@SW2
      * nattr() (aka attrcnt()) returns number of attributes on 
        an object. Suggested by Ashen-Shugar.
      * map() and foreach() now provide the element's position
        through %1. [LdW]
      * spellnum() function spells out numbers in words. [LdW]
      * wrap() for server-based line wrapping. Adapted from code by [LdW]
      * lmath() function lets you do math on delimited lists, and makes
        it easy to emulate Tiny's ladd/lsub/etc. [SW]
      * bitwise math functions. [SW]
      * mean(), median(), and stddev() functions. [SW]
      * bound() function for bounding numbers. [SW]
      * regrab(), regraball(), and regrep() regular expression 
        versions of grab/graball/grep. [SW]
      * controls() can now be used if you control either the <obj> or
        the <victim>. [RLM] suggested this in July 1998, but we were
        too boneheaded at the time to agree on it.

Commands:
      * teach <command> shows others in your room the (unparsed)
        command that you want to demonstrate, and then causes you
        to execute it. Suggested by Reed Riner.
      * /preserve switch for @clone and @chown to preserve privbits.
        By Kurt Fitzner.
      * rpage and rwho have been removed.
      * @nameformat on a room allows you to specify how the room's
        name should be displayed to those inside it when they look.
      * An optional second token for chat (in addition to +) can
        be set if you'd like + and = (or whatever) to both work.
        Patch by Kami@SW2.
      * @scan returns the matched attribute name as well as object.
        Suggested by many, including Thi@M*U*S*H.
      * ; waves is treated as :waves, instead of as ;waves.
        Suggested by Sandi Fallon, for tiny compatibility.
      * cv command at connect screen forces a !DARK connect.
        Suggested by David@M*U*S*H.
      * with obj=command tries a $command on a specific object. [TN]
      * @mailsignature finally implemented.
      * @chan/join and @chan/leave are aliases for @chan/on and @chan/off,
        respectively. Suggested by [LdW]
      * @chan/decomp/brief decompiles a channel without listing players.

Flags:
      * LISTEN_PARENT flag causes the object to inherit ^listens
        from its parent. By Kurt Fitzner.
      * Internal ACCESSED flag removed.
      * PARANOID player toggle replaces the old paranoid_nospoof
        configuration directive, and allows per-player setting of
        nospoof format. Suggested by Trispis@M*U*S*H

Minor Changes:
      * New lock @lock/command controls who may use $commands on an
        object. @lock/listen controls ^patterns, @lock/use controls both.
        Patch by Kurt Fitzner.
      * The max_obj_val and max_wiz_obj_val configuration options
        have been removed, as they're rarely used. You can change them
        in hdrs/conf.h (search for ENDOWMENT).
      * src/connect.c is no longer distributed. It wasn't ever used
        for anything anyway.
      * @fixdb command removed.
      * @config/functions and commands can show listings in lowercase.
      * match_list changed to try to match player aliases. Allows
        "look <alias>" for a player in the same room. Reported by Corum.
      * See_All players can now see/check AF_WIZARD attributes
        (but AF_MDARK still requires that you be roy/wiz).
        Suggested by Balazs Gasparin.
      * VERBOSE PUPPETs relay to their owners even if the owner's
        in the same room. Dedicated to Julianna@ATS.
      * You may now @dest objects that you control via a zone,
        as you could have done so indirectly before anyway.
        Reported by [LdW]
      * Sending the MUSH process an INT signal now causes graceful
        shutdown (not panic dump). Sending a USR2 signal causes
        a normal dump. As before, HUP causes config reload and
        TERM causes a panic dump. [TAP]
      * @chan/list shows your gag status. Suggested by Matt@M*U*S*H
      * When chatting, we only match partial channel names against
        channels you're actually on. Suggested by Matt@M*U*S*H
      * By default you can no longer speak to a channel you're not
        on. This is configurable per-channel with the new "open"
        priv. Suggested by Akiko@M*U*S*H.
      * If you can't go through an exit because it's linked to
        garbage or its variable destination is invalid, we no longer
        process the SUCC and DROP message set on the exit.
      * The Inherit() macro no longer includes a Wizard test -- we
        don't need it anymore as we protect Wiz objects in controls().
      * getrandom has been replaced by get_random_long, with a better
        algorithm and interface. Suggested by Stephen Dennis. [TAP]
      * Win32 compilers now get the __cdecl hint so they can compile
        using __fastcall which can greatly increase speed. Patch by
        Stephen Dennis.
      * For WIN32, use GetSystemTime instead of timeGetSystemTime.
        Patch by Stephen Dennis.
      * For WIN32, use a combination of wsadata.iMaxSockets and
        options.max_logins to pick a reasonable number of available file
        descriptors. Patch by Stephen Dennis.
      * Default dump messages now call it a 'save', not a 'dump',
        to avoid newbie confusion. Suggested by Vedui.
      * You're notified if you set an attribute/flag on a quiet object
        that you don't own. Patch by Kurt Fitzner.
      * @decomp now comments its "No attributes found" message so as
        not to break scripts.  Report by Kurt Fitzner.
      * More Mac tweaking. [DW]
      * \ and % are no longer valid in attribute names. Suggested by Ali Abdin
      * Cleanup to logging code. We now try to do almost all of it through
        log.c functions for better encapsulation. Patch by David@M*U*S*H.
      * New @lock/examine to restrict who may examine visual objects.
        Suggested by [LdW]
      * Examining objects now shows channels they're on, if any.
        Suggested by Big Spoon@M*U*S*H.
      * Channel-hidden players are now marked in @chan/who for those
        who are allowed to see them.
      * @uptime shows more upcoming events, and shows them to mortals.
        Suggested by Kyieren@M*U*S*H.
      * @chzone obj works like @chzone obj=none. Suggested by Mystery8@M*U*S*H
      * Player creation is now announced to MONITOR players. Suggested
        by Paul@M*U*S*H.
      * Poll message kept across @shutdown/reboot. Suggested by [SW].
      * The military_time directive is removed from mush.cnf. It only
        affected the way time was shown in @idle/@haven/@away messages
        anyway. Reported by Angelus@M*U*S*H.

Fixes:
      * help for lnum() and dig() improved. Leo@ATS TrekMUSH
      * help for @charges improved. Suggested by Scott Weber
      * @mvattr a/b=a/b would clear the attribute. No longer.
        Reported by Octavian@M*U*S*H
      * type(obj) would log a "WEIRD OBJECT" message if obj was 
        a garbage object. Reported by RLM. [TAP]
      * Bug in deciding when to take a penny for queued commands fixed
        by Stephen Dennis.
      * Portability fixes for gcc 2.95.2 and other compilers who require
        that function pointers in prototypes include the function args. 
        Reported by Gepht.
      * @chan/decomp should include the channel description, too. 
        Report by David@M*U*S*H.
      * Two other ways to be inside an object inside yourself reported by
        Ashen-Shugar, and one by Rhysem@M*U*S*H.
      * Small memory leak when doing @cpattr of a standard attribute to a
        non-standard attribute is fixed.
      * Help clarification for pemit() suggested by Falor@M*U*S*H.
      * Help parents and @search3 fixed. Suggested by rodregis@M*U*S*H.
      * Tport_anything didn't allow teleporting things to exits. 
        Noted by Vexon@M*U*S*H.
      * Z_TEL flag works on ZMO's as promised now. Report by [SW].
      * Potential crash in moveit fixed. Report by Howie@NF TrekMush
      * @cemit now does the checks that @chat does, in regard to being
        of the right type, allowed to speak, on the channel, etc.
        Suggested by Oleo@M*U*S*H.
      * getstring_noalloc was doing an fgetc into a char variable,
        instead of an int, so wasn't 8-bit clean. Report by Slava.

& 1.7.2p35
Version 1.7.2 patchlevel 35                        January 27, 2001

Fixes:
      * Fixed a bug in filter introduced in p34. Report by Jason Rhodes.
      * Help for sort() now indicates that 'n' sorts integers. Report by
        Dave Milford.


& 1.7.2p34
Version 1.7.2 patchlevel 34                        October 2, 2000

Fixes:
      * filter now looks at the whole result, not just the first
        character, when checking if the filter function returned '1'. [SW]
      * raw_input and raw_input_at are now unsigned char *, so
        they build right on HP/UX and similar. Report by Jeff Hildebrand


& 1.7.2p33
Version 1.7.2 patchlevel 33                        August 17, 2000

Fixes (backported from 1.7.3p4):
      * Bug in con() patched.
      * Bug in deciding when to take a penny for queued commands fixed
        by Stephen Dennis.
      * Configure portability fixes
      * Better handling of cases where the maildb has messages from
        dbrefs that are out of range (due to truncating a db to remove
        corruption, for example). Suggested by Ashen-Shugar.
      * Various fixes to better resist crashing due to attacks involving
        overwhelming connections. 
      * @mvattr a/b=a/b would clear the attribute. No longer.
        Reported by Octavian@M*U*S*H
      * type(obj) would log a "WEIRD OBJECT" message if obj was 
        a garbage object. Reported by RLM. [TAP]
      * Small memory leak when doing @cpattr of a standard attribute to a
        non-standard attribute is fixed.
      * Tport_anything didn't allow teleporting things to exits. 
        Noted by Vexon@M*U*S*H.
      * Z_TEL flag works on ZMO's as promised now. Report by [SW].
      * Potential crash in moveit fixed. Report by Howie@NF TrekMush
      * getstring_noalloc was doing an fgetc into a char variable,
        instead of an int, so wasn't 8-bit clean. Report by Slava.

& 1.7.2p32
Version 1.7.2 patchlevel 32                        April 17, 2000

Fixes:
      * @cpattr from a non-standard attribute to a standard one
        didn't preserve the AF_STATIC flag, and a subsequent atr_clr
        could cause a crash.

& 1.7.2p31
Version 1.7.2 patchlevel 31                        April 9, 2000

Minor Changes:
      * The SAY_TOKEN now applies to channels. That is, +public "Hi!
        will not result in a doubled initial quote any more.
        Suggested by Tyler Spivey.
Fixes:
      * Uninitialized negate_perms in the monitor flag table.
        Report by Concordia@Beyond the Fire.
      * Updates to help changes to match CHANGES.
      * Another way to end up in an object in your inventory has been 
        fixed. Report by Lensman.
      * Unused ancient ccflags cruft removed from hints files.
      * Considerable linting and cleanup. [SW]
      * MacOS portability improvements. [DW]
      * You may reset your @alias to itself in different case.
        Suggested by Bolt.

& 1.7.2p30
Version 1.7.2 patchlevel 30                        March 14, 2000

Major Changes:
      * New US export rules allow us to include shs.c and funcrypt.c
        in the Penn distribution! Yay!
      * Code is included in bsd.c for Windows NT users that uses
        NT's native i/o instead of the bsd socket layer for
        much improved performance. If you want it, edit src/bsd.c
        and uncomment the define at the top. [NJG]
Minor Changes:
      * New eplayer, eroom, eexit, eobject classes for searches,
        like Tiny. By Rhysem.
      * @sitelock/access.cnf can now use regexp patterns. By Raevnos.
      * The Exits() macro is replaced with Source(), Home(), etc.
        where sensible. By Maverick@M*U*S*H.
      * Example of bzip2 compression defines in mushcnf.dst by David@M*U*S*H.
      * shs.c can now be configured to reverse endianness, so you
        can more easily use win32 dbs on unix (or vice versa) without
        password hassles. This is in mush.cnf. [NJG]
      * JUMP_OK no longer allows anyone to @tel an exit into your room.
        You must control the destination or have the open_anywhere 
        power in order to do this now. Report by rodregis.
Fixes:
      * Calling do_log with LT_TRACE resulted in no logging. Report by David.
      * MacOS (and general) portability improvements, suggested by [DW]
      * help for before(), after() notes case-sensitivity. By Audumla.
      * hasflag() didn't work with MONITOR. Report by Mystery8.
      * A little more linting. [NJG]
      * Fixed help reference to 'global functions'. Report by Falor.
      * Some gmalloc fixes around missing newlines. Report by Raevnos
      * Improvements to help switch(). Report by Omozali.
      * Buffer overflow in @wall fixed. Report by rodregis.
      * Fixed (I think) the FreeBSD/Linux problem of not finding
        sigchld/sigcld and similar ilk. Hints for FreeBSD are back.
      * Crash bug in @link fixed. Report by Howie@New Frontier TrekMUSH

& 1.7.2p29
Version 1.7.2 patchlevel 29                        January 23, 2000

Fixes:
      * src/sig.c didn't include config.h. As a result, some systems
        with sigaction that didn't keep signal handlers installed
        (some linuxes) would crash very quickly on the second SIGALRM.

& 1.7.2p28
Version 1.7.2 patchlevel 28                        January 14, 2000

Minor Changes:
      * New 'deny_silent' option for access.cnf sites.
        Turns off logging of denied connection/creation/guest/register
        from a site, to prevent logfile spamming by twinks.
        Reported by Kludge-BC.
      * TFPREFIX attribute, if set, is used in place of FugueEdit>
        in @decomp/tf. [SW]
      * @grep/print no longer requires you to be set ANSI. Suggested 
        by Philip Mak.
      * Improved reporting of function invocation limit. [TAP]
      * /noeval switch added to think command.
      * Changes to enhance portability to Mac 68k platform and others
        that need < 32k of local data per function. [DW]
      * Objects are only considered to be listening if they're
        connected players, puppets, have an @listen set, or
        are things/rooms with MONITOR flags. Previously, things/rooms
        with ^patterns in attributes were considered listeners, even if
        they weren't MONITOR. Suggested by Luke.
Fixes:
      * gmalloc.c updated from 1987 version to 1995 version. By Gepht.
      * help corrections for shl and shr by Vexon@M*U*S*H.
      * help corrections for @clock by Krad@M*U*S*H.
      * RLIMIT_NOFILE bug fixed by Susan Thorne.
      * Eliminated variables named 'new' to promote easier C++
        compiles. Suggested by Gepht.
      * Compiling with CSRI_TRACE works again. [TAP]
      * signal stuff broken out to src/sig.c to allow link w/info_slave.
      * strcasecmp and friends prototyped better in externs.h. [DW]
      * Overzealous test for inherit flag on zoned objects corrected
        by Nveid.
      * Clearing an @attribute'd attribute's value on some object
        and later manipulating the attribute could corrupt the
        @attribute table in some cases. Fix suggested by Kami@SW2.
      * Nested pemits could truncate one another. Reported by Alierak.
      * Channel messages didn't correctly set %#. Reported by Saberwind.
      * info_slave used ident even if use_ident was off in the 
        mush.cnf file. Reported by Rhysem.

& 1.7.2p27
Version 1.7.2 patchlevel 27                        September 22, 1999

Minor Changes:
      * Added Raevnos's sitelock/name patch to allow removing names
        with @sitelock/name !<name> and to fix a display bug.
      * bsd.c, info_slave.c, and player.c now deal in IP addresses as well
        as hostnames (which can be spoofed), providing more reliable logging
        and access control. IP addresses are stored in the LASTIP attrib
        on players, as per LASTSITE. Suggested by David@M*U*S*H.
      * Hidden connections are announced as per DARK ones. Suggested 
        by Julianna@ATS.
      * New /noisy switch to @cemit prepends <Channel> to message.
        Suggested by Spork@M*U*S*H.
Fixes:
      * help vmul() incorrectly defined the dot product (which vdot() does).
        Reported by [SW].
      * Typo fixed in help @set3. Reported by Logain@ATS
      * Typo fixed in help @emit. Reported by Rhysem@M*U*S*H.
      * Various help fixes by mith, Big Spoon, and Krad@M*U*S*H.
      * @function now works for mortals as the help indicates. Report by mith.
      * @log/wipe should be @logwipe in comments in mushcnf.dst. 
        Report by Spork@M*U*S*H.
      * Object names are now limited to 256 characters. Fixes some
        buffer overflow issues.

& 1.7.2p26
Version 1.7.2 patchlevel 26                        July 18, 1999

Minor changes:
      * @verb didn't save stack args before dealing with the WHAT/OWHAT
        msgs, as TinyMUSH does. Changed to emulate TinyMUSH.
        Reported by Angel. [SW]
Fixes:
      * The noeval-eqsplit fix cause weirdness with attribute setting by
        directly connected players when specifying the obj by function.
        Fixed. Reported by Julienna@ATS.
      * Wizards couldn't modify atrlock'd attribs without breaking the 
        lock first. [SW]
      * @find by Wizards showed all garbage objects. Reported by mith.


& 1.7.2p25
Version 1.7.2 patchlevel 25                        July 10, 1999

Minor changes:
      * New 'nofixed' command restriction, by popular demand.
      * CONFIGURATION messages in netmush.log shortened to CONFIG.
        Suggested by mith.
      * Attributes with the Wizard flag can no longer by created/modified
        by any non-wizard, even that attribute's owner. Reported by
        Kurt Fitzner.
      * @pcreate now shows the dbref of created player. Suggested by
        Oderus.
      * When you receive an @mail message, you're now told the number.
        Suggested by Rak@M*U*S*H, among others.
      * The @toad command has been removed. The security issues it
        presents, though not unsolvable, aren't worth solving just to
        provide Wizards with a humiliating alternative to @newpassword.
Fixes: 
      * %q0-%q9 were not preserved during evaluation of player-message
        attributes (DESC, SUCC, DROP, etc.) Reported by Geoff Gerrietts
      * Added some hints from FreeBSD. Suggested by Lord Argon of mux.net.
      * Better Configure handling of library paths. 
      * 'nogagged' wasn't working correctly in restrict_command. Fixed.
      * @search on rooms sometimes reported a null room. Reported by mith.
      * Nearly all source files now include conf.h (which includes options.h), 
        and do so before any other PennMUSH header file except config.h 
        and copyrite.h.  Suggested by Joel Ricketts.
      * Fixed a few comparisons of <= db_top. Reported by Kurt Fitzner.
      * @oemit <obj>=<message> was emitting to the enactor's location,
        rather than to <obj>'s location, as it should have been. Fixed that
        and fixed help oemit() which documented this wrong behavior.
        Reported by Kurt Fitzner.
      * An 8-bit-unclean construction in bsd.c fixed by Christoper/Chicago.
      * p/noeval <message> (repaging) eval'd message anyway.
      * Args to $commands that looked like functions were being eval'd
        even if not in brackets. Reported by [SW]. [TAP]
      * @lock/listen could cause weird pose corruption. Reported by
        David@M*U*S*H. [SW]
      * Clarification of wiz_noenter in mush.cnf suggested by 
        Interloper@M*U*S*H.
      * Bug in orflags/andflags could cause weird results with toggles.
        Like nospoof players tested positive for 'J'. Reported by Saberwind.
      * Bug in make customize fixed. Reported by Saberwind.
      * References to a PASSWORD attribute removed from help. Reported by
        Saberwind.
      * Fixed db_top bug in search/lsearch reported by Saberwind.
      * @halt code was screwy. Reported by Krad@M*U*S*H
      * Wizards could grant @powers to God. Reported by Saberwind.
      * delete() with negative position arg could crash. Reported by
        Ashen-Shugar.
      * @clone of an exit while inside an object could have unpredictable
        effects. Reported by Andy@RobotechMUSH
      * Typo in help aposs() fixed. Reported by Philip Mak.
      * @hide now defaults to @hide/on. Reported by Saberwind.
      * ldelete() added help list functions. Reported by Rak@M*U*S*H
      * @attribute/rename didn't update the attribute's name quite right.
        Reported by mith.
      * @clone by a room didn't properly set the cloned object's location.
        Reported by Philip Mak.

& 1.7.2p24
Version 1.7.2 patchlevel 24                        April 5, 1999

Fixes:
      * @search/lsearch didn't behave right when given an upper range
        argument of exactly the highest dbref in the db. Reported by
        [SW].
      * Unlinked and HOME-linked exits were mishandled during dbcks, 
        just like variably-linked ones in pl23. Reported by [SW].
      * Help fixes. [TAP]

        
& 1.7.2p23
Version 1.7.2 patchlevel 23                        April 2, 1999

Fixes:
      * The NoLeave() macro was misdefined, but also not used (whew).
        Now it's defined right and used.
      * Giving a / without a switch to commands caused unpredictable
        behavior. Fixed. Report by Broncalo@Dune III.
      * Variable-linked exits were mishandled during dbcks, resulting in
        them being relinked to their source rooms.
      * @grep/iprint showed the hilighted matches in the same case as 
        the pattern was given, rather than the case there were in the
        attribute. Reported by Philip Mak.
      * The LAST attribute was set differently when players created and
        when the later connected. The latter case wasn't appropriately
        prepending single-digit dates with a 0, which fouls up convtime()
        calls on LAST. Noted by [SW].


& 1.7.2p22
Version 1.7.2 patchlevel 22                        March 19, 1999

Minor changes:
      * More extensive macro cleanup, based on a patch by David@M*U*S*H
      * Notable for your own code: Inherit() is now Inheritable(),
        DarkLegal() checks if something's ok to be invisible when it's DARK,
        Destroyed() is now IsGarbage(), and some other new helpful macros
        can be found in hdrs/dbdefs.h
      * Objects now store their creation cost, not their 'value' (which
        used to be cost/5 - 1, and had relevance for sacrificing, a now
        obsolete concept). There is no longer a limit on how much you
        can spend to create an object, and it's all refunded when the
        object is recycled. Reported by David@M*U*S*H.

Fixes:
      * Two memory leaks and one unbalanced mem_check fixed. [SW]
      * @oemit <room>/<object> was broken in many ways. 
        Reported by [SW].
      * Help @drop/@odrop/@adrop updated to mention use on exits.
        Suggested by Stewart Evans.
      * God using @logwipe and giving the wrong password crashed the MUSH.
        [SW]
      * search() was behaving as lsearchr() not lsearch(). Noted by
        KMoon.
      * Bad range arguments for @search and lsearch() now give an
        error message and don't charge the player. [SW].
      * Help @search3 had a typo. Fixed by Halatir@M*U*S*H.
      * Restricting the 'goto' command now also restricts movement
        through exits. Suggested by Christopher Poff.
      * Objects and rooms now notify their contents when they start/stop 
        listening. Report by [RLM].
      * Error in help for @channel referring to @config. Krad@M*U*S*H


& 1.7.2p21
Version 1.7.2 patchlevel 21                   February 16, 1999

Minor changes:
      * The restart script now tries to determine its own directory,
        so it may not require editing to set GAMEDIR any more.
        Idea by David@M*U*S*H.
      * Various @find/@search/@entrances commands charged you the
        FIND_COST even if you didn't have permission to run the command.
        We don't do that any more. Report by Jonathan Booth.
      * $command and ^listen pattern matching is now case-insensitive
        even when the attrib is set REGEXP, unless the attrib is set
        CASE. In the past, glob matching was case-insensitive and
        regexp matching was case-sensitive, which cause problems if
        you tried to regexp match a disabled standard command.
        Now you've got full flexibility. This may break any current
        regexp-based $command or ^listen matching that relies on
        case sensitivity (set those attributes CASE). We now also
        have a new insensitive regmatch function: regmatchi()
        Report by Jonathan Booth.

Fixes:
      * Anyone could @chan/priv channels, even if they didn't pass
        the modlock. Report by David@M*U*S*H.
      * DARK disconnects are now shown correctly on chat channels.
        Really this time. :) Report by Broncalo@Dune III
      * help for CONNECTED flag updated. Report by matcat@M*U*S*H
      * Using @kick within a user-defined command could crash the MUSH.
        Reported by Kludge-BC. [TAP]


& 1.7.2p20
Version 1.7.2 patchlevel 20                   January 26, 1999

Minor changes:
      * Many expression replaced with macros by David@M*U*S*H.
Fixes:
      * @mail/silent/urgent didn't set the message urgent. 
        Patch by Halatir@M*U*S*H.
      * You could get free coins by repeatedly killing your objects.
        Reported by Max@M*U*S*H. [TAP]
      * You could rename a channel to a name already in use.
        Reported by David@M*U*S*H.


& 1.7.2p19
Version 1.7.2 patchlevel 19                   December 2, 1998

Minor changes:
      * The main select() polling loop now times out every second,
        so we will reliably call local_timer() and handle alarms
        every second. Suggested by [NJG].
      * 'make' now performs a make in game/txt, assuring that help
        indices are rebuilt after a patch. Suggested by Broncalo@Dune III.

Fixes:
      * Crash in using @cpattr with standard attribs fixed.
        Reported by Atuarre@ATS.


& 1.7.2p18
Version 1.7.2 patchlevel 18                   November 25, 1998

Minor changes:
      * Guest players don't receive a paycheck any more. Suggested by
        Kyieren@M*U*S*H
      * look_helper() internal function now uses privtabs. As an
        epiphenomenon, @set obj/attr=locked is now synonymous to
        @atrlock obj/attr=on. Suggested by [SW].

Fixes:
      * Win32 compile fixes. [NJG]
      * DARK disconnects are now shown correctly on chat channels.
        Report by Broncalo@Dune III
      * Quiet players no longer see 'Title set.' messages when
        using @chan/title. Patch by Halatir@M*U*S*H.
      * @cpattr/@mvattr now copy attribute flags. Report by Jon Booth.
      * Some compiler warnings fixed by Atuarre.
      * The 1 and 5 minute dump warning messages weren't being used.
      * When matching regexp's, later parenthesized subexpressions 
        weren't correctly assigned to %-vars when earlier ones 
        were empty. Report by Geoff Gerrietts. [TAP]
      * Some messages as a result of looking at a room were being
        placed onto the wrong queue, so remote viewers (@listen *,
        @pemit/remit to somewhere) would get things out of order.
        Reported by David@M*U*S*H. 
      * Help added for functions() and fixed for timestring(). 
        Report by Geoff Gerrietts.
      * soundex() misbehavior for very short words fixed.
        Report by kmoon.
      * @attribute/access acted as if it were always /retroactive. [SW]
      * Changes of flags on a standard attribute were lost across
        restarts. Reported by [SW].
      * lcstr, ucstr, capstr, and encrypt and decrypt in the 
        "real" funcrypt.c are now ansi-aware. The former 3 preserve
        ansi formatting, while the latter two strip it. You must download
        a new version of funcrypt.c from ftp.pennmush.org (USA/Canada)
        or export.pennmush.org -- it is not patched herein. 
        Reported by Ashen-Shugar.


& 1.7.2p17
Version 1.7.2 patchlevel 17                   November 11, 1998

Minor changes:
      * Newly created players now have a default uselock of =me.
      * Number of available file descriptors is printed in startup log.
        Suggested by Doogie@ATS Trekmush.
      * The @chat/@cemit commands can no longer be used by gagged players.

Fixes:
      * Adding functions in funlocal.c shouldn't produce compiler warnings.
        Patch by Halatir@M*U*S*H
      * log(0) or ln(0) could crash non-IEEE compliant math libraries.
        Reported by Drakwil and Talos at SNW.
      * csrimalloc wouldn't compile with glibc. Fix by Mike Selewski.
      * Order of checks for number of file descriptors changed to
        do better on POSIX and hybrid systems like FreeBSD. Suggested by
        Doogie@ATS Trekmush.


& 1.7.2p16
Version 1.7.2 patchlevel 16                   October 17, 1998

Fixes:
      * table() could be used to crash the MUSH. Report by Ashen-Shugar. [TAP]
      * whisper/list didn't work. Report by Kamala@ATS TrekMUSH, via
        Mikey@M*U*S*H 
      * andflags(player,C) checked for the (useless) CHOWN_OK flag
        rather than the COLOR flag. Its now been special-cased to
        check COLOR on players. This is a kludge, but probably worth it.
      * Top of admin WHO now lists 'Loc #' not 'Room #', as that's more
        accurate. Suggested by Saberwind.
      * @log/wipe returns as @logwipe. Its absence was reported by 
        Nveid@M*U*S*H.
      * Date in hdrs/version.h now y2k compliant.


& 1.7.2p15
Version 1.7.2 patchlevel 15                   September 7, 1998

Fixes:
      * @emits weren't propagated through AUDIBLE exits. Report by Nammyung.
      * Building w/o ROYALTY_FLAG defined works again. Report by Scott Weber.
      * When matching $ or ^ patterns with the REGEXP attribute flag set,
        a failed match would then be improperly checked for normal 
        matching as well. Reported by Jason Rhodes.
      * Attribute flags weren't listed in @decomp. Reported by
        Jonathan Booth.
      * Make customize never got updated to match the new mushcnf/restart
        system. Now it has. Reported by Manic@FinalFrontier
      * @edit now works on attribs starting with _. Reported by Jason Rhodes.
      * Help files should work better on Win32. Reported by Miphon. [TAP]


& 1.7.2p14
Version 1.7.2 patchlevel 14                   August 4, 1998

Minor Changes:
      * You may @parent to an object you control via ZMO, even if you
        don't own it. Patch by Halatir@M*U*S*H
      * In lsearch() and @search, you may refer to object types
        in either the singular (ROOM) or plural (ROOMS).
      * Most chat messages now include the name of the channel. 
        Suggested by Philip Mak.

Fixes:
      * Long @chat messages crashed the server. Reported first by Rusty
        and Siris@M*U*S*H. [TN]
      * Setting the ZONE flag on a non-zonelocked player should give
        a warning, and wasn't. Reported by Halatir@M*U*S*H
      * @@ was parsing its argument. No longer. [RLM]
      * The @config listing was weird w.r.t. compression. [TN]
      * @shutdown/reboot could cause a crash if a player had an
        OUTPUTPREFIX or OUTPUTSUFFIX set.
      * Hint to linux users about undefining I_MALLOC when using
        gmalloc. Reported by Kyle Forbes.
      * @shutdown/reboot now calls local_shutdown(). Reported by Kyle Forbes.
      * When loading a db in which an object with dbref n has attributes
        owned by players with dbrefs > n, the attribute ownership was
        reset to GOD. This should no longer happen unless the owner 
        really is invalid. Most recently noted by [SW].
      * Exits that have contents (corrupt!) are fixed up in dbck.
      * dbck is run whenever the db is loaded.
      * objeval() help fixed. Reported by Yeechi Chen.
      * Compiling without ROYALTY_FLAG defined was broken. Reported by
        Scott Weber.
      * Sufficiently tricky use of locks could cause a crash due to
        massive function invocation or recursion. Reported by Atuarre. [TN]


& 1.7.2p13
Version 1.7.2 patchlevel 13                   July 7, 1998

Minor changes:
      * @mail/file now shows the folder name of the destination folder
        as well as its number. Suggested by Julianna@ATS TrekMUSH

Fixes:
      * Problems with ANSI causing Pueblo to bleed have been identified
        and fixed!
      * Bug with cwho() fixed. Report by Tripsis@M*U*S*H. [TAP]
      * 'make diffs' in Makefile updated to use prcs and to produce
        diffs for patches without Index: lines which may confuse
        non-POSIX versions of patch.  
      * Fixed typo in options.h reported by Kyle Forbes.
      * Comments in src/services.c and src/filecopy.c are now C-style,
        not C++ style. Some compilers were puking on these, even though 
        WIN32 wasn't defined and the preprocessor should've ignored this 
        stuff. Go figure.
      * Side-effect functions like pemit() didn't obey the restrictions
        on the corresponding command (like @pemit), and setting attributes
        with @set could get around restrictions on ATTRIB_SET. 
        Reported by Scott Weber. [TAP]
      * Help for t() and elock() clarified by Octavian@M*U*S*H.
      * next() could be used on an object in a room that the player
        didn't control to get the room inventory. Reported by Octavian@M*U*S*H
      * hint/aux.sh has been renamed hints/a-u-x.sh. This means it won't
        be properly recommended by Configure on A/UX systems, but Win32
        programs often puke on files name 'aux.*' because they're braindead,
        and there are lots more Win32 users than A/UX users. Bummer.
      * When A was inside B, and @listen B=*, A would hear everything
        in B's room (good) except B's own speech (bad). Report by 
        Nemesis @ Beast Wars 2
      * help exits clarified by Nammyung@M*U*S*H
      * help comp() clarified by Halatir@M*U*S*H
      * @squota without a limit now shows the victim's quota in addition
        to asking what it should be set to. This more closely matches
        the old behavior of @squota without a limit being treated as
        @quota. Reported by Matt@M*U*S*H
      * @chan/what on a nonexistent channel didn't produce any
        feedback. Reported by Octavian@M*U*S*H.
      * Typo in help zone master rooms corrected. Report by Matt@M*U*S*H.


& 1.7.2p12
Version 1.7.2 patchlevel 12                   June 11, 1998

Fixes:
      * GAGGED players could pose/semipose. Reported by Jorhan@M*U*S*H. [TN]
      * convsecs() help clarified.
      * @decomp obj/attr didn't work if you couldn't examine the object
        even if the attribute was visible. Reported by Jonathan Booth.
      * make customize had a problem with the way it handled the
        hlp directory. It now creates a real hlp directory, but makes
        all the standard hlp files symlinks to the distributed ones.
        (It used to make the hlp/ directory a symlink, which did bad
        things with 'txt/Makefile'. Report by Gasparin Balazs.
      * help control rewritten to clarify the real algorithm.
        Suggested by [SW].
      * Configure is more flexible when determining if you're
        building under cygwin. Reported by Miphon.
      * zfun() worked, but gave an error message anyway. Fix by Rob@DuneIII
      * hdrs/regexp.h renamed to hdrs/myregexp.h to avoid conflict
        with standard regexp.h header file in cygwin.
      * Roy/see_all players could, under some circumstances, evaluate
        functions with wiz privileges. Reported by Atuarre. [TAP]


& 1.7.2p11
Version 1.7.2 patchlevel 11                   May 25, 1998

Changes:
      * The PennMUSH copyright notice has been changed, as the
        licensing terms for TinyMUD/TinyMUSH 2.0 have changed,
        and to update the TinyMUSH 2.2 part of the copyright and
        the PennMUSH part as well. 'help copyright' now gives the
        copyright, and it's in COPYRITE and hdrs/copyrite.h.
        The licensing terms are now shorter, but practically very similar.
 
Fixes:
      * Possible infinite loop (with disk-filling output!) in @dbck
        with certain types of DB corruption fixed.  Report by RLM and
        Arathorn@CDI.  [TAP]
      * @undest intermittent crash-bug fixed. Report by Arathorn. [TAP]
      * regmatch() crash-bug fixed. Report by Tavoan@ATS. [TAP]
      * Ansi bleeding problem fixed. Report by Atuarre@ATS. [TAP]
      * The embedded version of mkindx used by Win32 builds had a bug - 
        some global variables weren't getting properly reset.
        Fix by Stephane Thibault.
      * Help for @oxmove added. Report by Bray Roned@ATS.
      * isnum() was broken if tinymath was defined. Report by Daniel Peters.
      * portmsg needed MUSH_IP_ADDR, which is now runtime configured.
        It no longer does (see comment in portmsg.c if you need this
        functionality). Report by Daniel Peters.
      * Help for dig() and lnum() clarified by Andre Leopold.


& 1.7.2p10
Version 1.7.2 patchlevel 10                   April 24, 1998

Fixes:
      * MANIFEST updated to reflect the deletion of src/nmalloc.c


& 1.7.2p9
Version 1.7.2 patchlevel 9                    April 21, 1998

Fixes:
      * Myopic flag didn't work unless Pueblo support was on. Reported by
        Rhysem@M*U*S*H.
      * help debug referred to can_debug, a now-obsolete power.
        Reported by Rodimus Prime @ TF2005.
      * @chown to a Zone Master didn't work. The @chown code has been
        rewritten to be easier to read. Report by Trispis@M*U*S*H.
      * open_anywhere was mis-listed in help powers2. Report by Trispis.
      * nmalloc.c is removed, and Win32 compiles should be a bit easier.
      * Win32 build no longer limited to 64 sockets; 256 instead. [NJG]


& 1.7.2p8
Version 1.7.2 patchlevel 8                    April 2, 1998

Fixes: 
      * round() could crash on very big numbers on some systems.
        Reported by Atuarre@ATS.
      * Problem with exits getting a contents list in certain 
        conditions fixed. Reported by Atuarre@ATS. [TAP]
      * Problems with puppets and Pueblo fixed. Report by Mop-Boy.
      * mkindx problem with dos text files fixed. [NJG]
      * Order of include files in htab.c was wrong, caused compilation
        problems on SCO Openserver. Reported by Flame.
      * On Win32, the MUSH could quit without flushing its buffers. [NJG]
      * When inside of an object with @listen *, you didn't see things
        when the object did a 'look'. Reported by Vedui.
      * Warnings in rwho.c eliminated. [NJG]
      * More fooling around with mymalloc.h to help the Win32 compile.
        Suggested by NJG.
      * open_everywhere power get left off help powers list at some point.
        Reported by Steven@Champions.
      * Error message for joining a non-existant channel was different
        from that for joining a channel that exists but you can't
        see. Reported by Octavian@M*U*S*H.
      * get()'ing an attribute that isn't set now returns an error 
        message only if the default permissions don't allow you to 
        get it. This allows get(player/ALIAS) to always work, returning
        an empty string if the player has no ALIAS. [TAP].
      * base_room mush.cnf option got left out.
      * dbck didn't check for disconnected rooms correctly. Noted by
        Rhysem.


& 1.7.2p7
Version 1.7.2 patchlevel 7                    March 10, 1998

Fixes:
      * Typo fixed in pennflag.hlp. Report by Keith Howell.
      * Bug in mid() that could cause crashes on some OS's when using
        bad arguments fixed. Report by Yanek@DragonStarMUSH. [TAP]
      * @wait obj=command fails when tiny_math is defined. Report by Yanek.
      * With tiny_math defined and tiny_booleans not defined, 
        strings in booleans weren't being treated as 1. Report by Yanek.
      * @decompile now shows @powers, too. Report by Jonathan Booth.


& 1.7.2p6
Version 1.7.2 patchlevel 6                    March 8, 1998

Fixes:
      * src/mymalloc.c now includes config.h correctly. [NJG]
      * @zemit would change zones of objects while running.
        Report by Steve Sanderlin and Vedui.
      * Minor cosmetic bug in @config/list. Reported by Mike Wesson
      * @chown'ing an object to a Zone player doesn't reduce the Zone
        player's quota, but @chown'ing an object back from a Zone player
        should reduce yours (and didn't). Report by Vedui.


& 1.7.2p5
Version 1.7.2 patchlevel 5                    March 2, 1998

Fixes:
      * @cloning an object on a channel could crash the MUSH. Report by
        Mordak@ATS.
      * You couldn't add 2 objects with the same name to a channel.
        Report by Mordak@ATS.
      * Help for inc() fixed. Brian@M*U*S*H
      * On Win32, the text file indexes are now properly sorted,
        and things work ok if you don't have a text file defined. [NJG]
      * Wiz objects couldn't add players to channels. Report by Mike@M*U*S*H
      * Compile problem with fork and win32 fixed. [TAP]
      * You shouldn't get nospoof notification from your own emits. [TN]
      * You no longer get nospoof notification from every @chat, only
        from @cemit.
      * @lock obj=here or @lock obj=exit failed. Report by Luke@M*U*S*H
      * The MUSH announces where it's sending stderr when it starts up. [NJG]
      * If there was nothing on the queue, and no user activity,
        the MUSH could wait as long as 999 seconds before checking to
        see if it should do anything (like a dump, a shutdown, idling
        someone out, etc.) This has been changed to 5 seconds.
        Report by NJG.
      * Encryption buffer for SHS encryption was too small, could cause
        password problems. [NJG]


& 1.7.2p4
Version 1.7.2 patchlevel 4                    February 24, 1998

Fixes:
      * Fixed a few more compiler warnings under Win32. [NJG]
      * Output to a non-ANSI, non-COLOR player could cause crashes.
        Reported by Vedui.


& 1.7.2p3
Version 1.7.2 patchlevel 3                    February 22, 1998

Fixes
       * Fixed a slew of compiler warnings under Win32. [NJG]
       * Jonathan Booth Removed a few #ifdef EVENTS that lingered.
       * Room names weren't shown bold to people who had ANSI
         but not COLOR set. Report by Sylvia
       * Added help alias pueblo() for pueblo. Suggested by Vedui.
       * Fixed some problems with ansi() and tf reported by Vedui.
       * @readcache could cause crashes. First report by Mop-Boy.
       * src/tcl.c is now better located by Configure. [TN]


& 1.7.2p2
Version 1.7.2 patchlevel 2                    February 19, 1998

Fixes:
       * Reading of compressed dbs didn't work right. Report by Roger Christie
       * Fix to help to remove reference to @config/globals. Mordak@ATS.


& 1.7.2p1
Version 1.7.2 patchlevel 1                    February 18, 1998

Fixes:
       * max_dbref was limited to 256 by mistake. Report by Rhysem@M*U*S*H
       * restricted_building in mush.cnf didn't work. Does now.
         Report by Rhysem@M*U*S*H
       * memchecks for hash tables didn't work right. Report by [SW]


& 1.7.2p0
Version 1.7.2 patchlevel 0                    February 9, 1998

Major Changes:
       * Support for the Pueblo MUD client (http://www.chaco.com/pueblo)
         which allows the MUSH to send html to the client. This is
         runtime configurable with @enable/@disable and mush.cnf. [TN]
       * Regular expression support: the REGEXP attribute flag causes
         attributes to match $ and ^ patterns using regular expressions.
         regmatch() matches regular expressions. [2.2]
       * PennMUSH tarfile now unpacks itself in a pennmush/ directory,
         by popular request. pennmush/ is now the 'top-level' directory;
         patches should still be applied from within the pennmush/ directory.
       * More compile-time options are now run-time options:
          HASPOWER_RESTRICTED, SAFER_UFUN, DUMP_WARNINGS,
          INDEX_COMMAND, RULES_COMMAND, HATE_DEST (general command rename?),
          NOISY_WHISPER, POSSESSIVE_GET POSSGET_ON_DISCONNECTED,
          REALLY_SAFE, DESTROY_POSSESSIONS, NULL_EQ_ZERO,
          TINY22_BOOLEANS, TINY_TRIM_ORDER,
          ADEST_ATTRIB, AMAIL, PLAYER_LISTEN, PLAYER_NOAHEAR,
          ROOM_CONNECTS, ANSI_NAMES, COMMA_EXIT_LIST, COUNT_ALL,
          EXITS_CONNECT_ROOMS, WIZWALL_PREFIX, RWALL_PREFIX, WALL_PREFIX,
          NO_LINK_TO_OBJECT, QUEUE_PER_OWNER, WIZ_NOAENTER, USE_IDENT,
          MUSH_IP_ADDR, MAILER, ANSI_JUSTIFY, PLAYER_NAME_SPACES,
          NO_FORK, EVENTS, MILITARY_TIME, LOGIN_LIMIT, IDLE_TIMEOUT,
          RESTRICTED_BUILDING, FREE_OBJECTS, QUOTA, BUILDING_LIMIT,
          FLAGS_ON_EXAMINE, EX_PUBLIC_ATTRIBS, TINY_ATTRS, FULL_INVIS,
          SILENT_PEMIT, PLAYER_LOCATE, DO_GLOBALS, GLOBAL_CONNECTS,
          PARANOID_NOSPOOF, ACCESS_FILE, NAMES_FILE, OBJECT_COST,
          EXIT_COST, LINK_COST, ROOM_COST, QUEUE_COST, QUOTA_COST,
          FIND_COST, PAGE_COST, KILL_BASE_COST, KILL_MIN_COST, KILL_BONUS,
          QUEUE_LOSS, DBTOP_MAX, MAX_OBJECT_ENDOWMENT,
          MAX_WIZ_OBJECT_ENDOWMENT, MAX_PENNIES, MAX_DEPTH, MAX_PARENTS,
          PURGE_INTERVAL, DBCK_INTERVAL.
       * All the functions that used to be optional are now
         enabled. The increase in code size is negligible, and
         the decrase in options is a win. We'll probably add 
         some way to restrict function use in mush.cnf in the future.
       * The original MUSH chat system is no longer distributed or
         supported. The OBJECT_CHAT option is thus obsolete.
         If you've been using the old system, your db will automatically
         be converted to the new one, but you will need to recreate
         your channels and readd players to them.
       * ADD_NO_COMMAND_FLAG has been removed, as few people need
         to add NO_COMMAND en masse to all their rooms and players
         any more. Those that do can use MUSHcode for this.
       * The definitions of GOD, MAX_ARG, have been moved out of options.h, 
         because redefining these isn't really an option you want to exercise.
       * dune.h is no more. Raise a glass to it.
       * Non-standard attributes that are created by objects are set to 
         no_command by default. This improves security in many common cases, 
         but may require your object code to @set the attribute !no_command
         after it creates it, if the attribute is meant to contain
         a $command. Attributes set by players themselves (typed directly
         from a socket) still work as they used to, as do standard
         attributes (@va-@vz, for example). [TN]
       * Hash table code has been tightened up. [TN]
       * New option: tiny_math. Treat strings as 0 in math functions
         rather than errors. This is handy for Tinymush compatibility,
         even though it may make real errors harder to find.
         Suggested by Ashen Shugar.

Minor Changes:
       * idlesecs() now returns the number of seconds idle for the least
         idle connection of the player.
       * conn() now returns number of seconds connected for the longest
         connected connection of the player.
       * I wrote the COPYRITE file some time ago, but forgot to include
         it in the dist. Oops!
       * UFAIL/OUFAIL/AUFAIL is here. Suggested by Mike Affourtit.
       * controls() is now ok if you are See_All; you don't need to 
         actually control the object you're testing. Reported by RLM.
       * If you're allowing empty attributes, ICLOC is set to ""
         on newly created players, instead of " ", to permit testing
         with hasattrval. Suggested by Jonathan Booth. [TN]
       * Improvements to FPE handling on FreeBSD. By Jason Young.
       * New switch /noeval for @mail. Suggested by Mop Boy.
       * The "dbcomp" directive in mush.cnf has been removed.
         "compress_suffix" has been added. Databases are now specified
         without compression suffixes.
       * You are warned if you fail to define an option in the config file.
         Suggested by TN.
       * @config can now list config options in logical groups.
       * mail.c has been removed. extmail.c is used directly instead.

Fixes:
       * hasattr/get/xget/eval now are less likely to tell a player something
         they're not privileged to know about the existence of attributes. [TN]
       * The big_que function has been renamed parse_que. The parse_que
         function (which just called big_que) is gone.
       * FAQ updated, as well as other references to pennmush.tinymush.org.
       * Giving a negative argument to convsecs() would crash Win32.
         As there's no reason to ever do that, you now can't. 
         Reported by Javin@DynamixMUSH
       * dist2d and dist3d now return floating point numbers when
         FLOATING_POINTS is defined, as they said they would.
       * help for pi() now refers to it as 3.141593, which is what
         the function actually produces, due to rounding. Report by Vedui.
       * help for beep() notes that royalty can use it to. Report by Vedui.
       * Using a maildb that referred to db#s that didn't exist
         in the object db (e.g., replacing your object db with minimal.db
         without removing the maildb) would crash the server.
         Now the server fixes up invalid messages after loading maildb
         Report by TN.
       * Connect screen and other cached text files should now be
         automatically terminated with CRLF, so windows and other
         telnet programs will see them correctly. Report by many. [TN]
       * The separator in iter() is now parsed. Report by Ashen-Shugar.
       * match(foo,>) always returned 1; similar problems with matchall,
         grab, graball, strmatch, and elements. Report by Ashen-Shugar.
       * Objects listening for channel broadcasts with ^<chan> *: didn't
         work. Now they do.
       * When you disabled a command in order to override it in MUSHcode,
         calling the command with switches didn't work. 
         Reported by Ben Kenobi. Patch by Eyal Sagi and TN.
       * Calls to cut in utils/mkcmds.sh relied on "-f 2" working like
         "-f2". On at least Ultrix 4.4, it doesn't. Report by Cwilla.
       * Link strdup.o to info_slave because some systems need
         strdup! Report by Cwilla.
       * Some help file typos cleaned up by Ken Ray.
       * exit() used to work on non-rooms. Not anymore. Report by
         Trispis@MUSH101 
       * All header files now idempotent.
       * @tel me=home or @tel home now works in all cases where 'home'
         works. Report by Vedui.


& 1.6.10p6
Version 1.6.10 patchlevel 6                   May 11, 1997

Fixes:
        * inc() and dec() didn't work right with NULL_EQ_ZERO.
          Fixed. Report by Dennis DeMarco

& 1.7.1p3
Version 1.7.1 patchlevel 3                    January 12, 1998

Minor Changes:
       * A file called MANIFEST is now distributed. Configure uses this.
         Don't mess with it unless you know what you're doing.
       * An additional note for those upgrading from versions before
         1.7.0p9, describing an anomaly with player parents and how
         to handle it has been added to README. Report by Roger Christie.

Fixes:
       * controls() now requires that the function caller control
         the object named in the first argument. Suggested by TN.
       * Player parents were being cleared at every login.
         Fixed by Jonathan Booth.
       * effect should be affect in game/txt/newuser.txt. 
         Reported by Jason Young.
       * hints file for OS/2 now included. Suggestions by Sylvia.
       * FNDELAY changed to O_NDELAY in ident.c. Suggested by Sylvia.
       * Minor change to time_format_1 to make 64bit SGI happier.
         By Thaddeus Parkinson.
       * Help for inc()/dec() improved. Suggested by Jonathan Booth.


& 1.7.1p2
Version 1.7.1 patchlevel 2                    January 5, 1998

Fixes:
       * References to TinyMUSH in the .txt files are now PennMUSH.
         Reported by Corum.
       * It was possible to use @name to create players with the same
         name. Ick. Reported by Sylvia.
       * utils/mkcmds.sh now produces a preindented switchinc.c,
         to match the one that gets diffed in patches. [TAP]


& 1.7.1p1
Version 1.7.1 patchlevel 1                    December 29, 1997

Fixes:
        * table() now behaves with ANSI_JUSTIFY. Reported by Jonathan Booth.
        * ident.c was defining strdup; so was strutil.c. Now only
          strutil.c does. Reported by Matt Philips. [TAP]
        * Bug in restart script fixed. [TAP]
        * shs.h patched to autoconfigure endianness. Reported by TN.
        * shs.h fixed to be idempotent. [TAP]
        * shs.h is now distributed with PennMUSH. You still have to get
          shs.c from export.pennmush.org if you want it.
        * README now refers to lists.pennmush.org. [TN]
        * We no longer recommend setting use_dns to no on win32 systems.
          It seems to work fine as yes.


& 1.7.1p0
Version 1.7.1 patchlevel 0                    December 21, 1997

Major Changes:
        * It is no longer necessary to edit src/Makefile when building.
          RWHO is now integrated, and totally runtime configured in mush.cnf.
          IDENT is now configured from dune.h. The IDENT/ and RWHO/
          directories are no more.
        * The win32 build now requires the gnu-win32 package
          (available at XXX). It can be built either with MSVC++
          or the free win32 version of gcc included with gnu-win32.
          The build is better integrated into the distribution --
          the win32/ directory is no more. [TAP]
        * You can now build with one of 3 password-encryption schemes:
          None, Unix (des) crypt(3), and shs (requires getting shs from
          export.pennmush.org). This will be useful to folks who're using
          shs encryption on Win32 platforms and then move their db to
          a Unix platform -- they can just use shs under Unix and all's well.
          This is set as CRYPT_SYSTEM in options.h
        * @log/wipe used to require entering the game account password,
          but that's non-portable. Instead, a "log_wipe_passwd" is now
          specified in mush.cnf.
        * README rewritten [TAP]

Minor Changes:
        * @lock/drop on a room now controls who can drop things in the room.
        * "configure" (lower-case 'c'), a wrapper for Configure that used
          to be included is no longer. Few used it, and it can screw up
          win32 systems that aren't case-sensitive.

Fixes:
	* blind_page was written as blindpage in game/mushcnf.dst.
          Reported by Raevnos@ShadowMist.
	* udefault() was broken. Reported by John Hutchinson
        * Some lintwork in csrimalloc.c, to get rid of signed/unsigned
          warnings and others.
        * help @list fixed to show the correct @config switches.
          Reported by Leo@ATS TrekMUSH
        * @chan/gag now works correctly. Report by Vedui.


& 1.7.0p11
Version 1.7.0 patchlevel 11                    November 18, 1997

Fixes:
        * Help for remove() updated. Reported by Vedui@Robotech.
        * hasattr() didn't check if the invoker had permission to read
          the attribute. Reported by Vedui@Robotech.


& 1.7.0p11
Version 1.7.0 patchlevel 11                    November 18, 1997

Commands:
        * page/blind produces a separate page to each person paged,
          so they can't tell if the page was a multipage. This is the
          same as the default PennMUSH page behavior (but see Options)

Options:
        * New mush.cnf option 'blind_page'. If 'yes', page defaults to 
          page/blind.  If 'no', page defaults to page/list. By popular 
          request. :)
        * New dune.h option MUSH_IP_ADDR. Define if your host system has
          multiple IP addresses to specify which address to listen on
          for connections. By Bobby Bailey (Chil).

Minor Changes:
        * All calls to isalnum replaced with isalpha || isdigit, because
          some linux systems appear to have a broken isalnum!
        * For some reason, the variable name 'restrict' in fun_lsearch
          broke compilation on James Cook's system. Gwennie@SNW fixed
          this by changing the name. Ok, I've changed the name, too,
          as a preventative measure. *shrug*
        * When a player can't connect because logins are disabled or
          the MUSH is full, we no longer (a) show a disconnect message
          to MONITOR players, (b) purge the player's mail anyway, or
          (c) show the player quit.txt in addition to full.txt/down.txt.
          Suggested by John Hutchinson.

Fixes:
        * When a halted player triggers a $command *:, %0 was including
          an initial space that wasn't being trimmed. Reported by
          Jonathan Booth. [TAP]
        * functions() works right again. Patch by Atuarre@ATS TrekMUSH
        * look/out allowed looking at any db#. Reported by Lews Therin@DDM

& 1.7.0p10
Version 1.7.0 patchlevel 10                    October 30, 1997

Minor Changes:
        * Players can now have @parents. Inspired by AJ Prowant.

Fixes:
        * @drain was doing @notify instead. Ick. Reported by Amberyl.
        * Royalty can @boot, as the help suggests. Reported by Vedui@Robotech
        * (Hopefully current) copies of hdrs/funs.h and hdrs/cmds.h are
          kept in the win32/ directory for win32 folks who don't have
          a Bourne shell and can't run utils/mkcmds.sh.


& 1.7.0p9
Version 1.7.0 patchlevel 9                    October 16, 1997

Fixes:
        * @clone could corrupt the db on some machines in some cases. 
          Report by Jonathan booth. [TAP]
        * @list attribs now works. Report by Corum@StormWorld.

          
& 1.7.0p8
Version 1.7.0 patchlevel 8                    October 15, 1997

Fixes:
        * Hopefully the final command_parse fix. 


& 1.7.0p7
Version 1.7.0 patchlevel 7                    October 15, 1997

Fixes:
        * The ANSI_JUSTIFY patch got left out somewhere. It's back.
          Report by John Hutchinson.
        * +channel and exits are broken in 1.7.0p6 due to our stupidity.
          Fixed again. Report by John Hutchinson.
        * @cemit was restricted to Wizards, and should have been restricted
          to Wiz or Royal. Fixed. Reported by Vedui@Robotech.


& 1.7.0p6
Version 1.7.0 patchlevel 6                    October 9, 1997

New Functions:
        * cand(), cor() are short-circuit boolean functions. Suggested by
          Flame who saw reference to them in a patch to TinyMUX. [TAP]
        * if() and ifelse() do about what you'd expect. Suggested by
          a number of people. [TAP]

Minor Changes:
        * Prototypes for the functions in src/local.c are now in
          hdrs/externs.h
        * round(.15,1) = .1 on many systems due to the floating point
          representation. A tiny kludge around this is now in place.
          Reported by Flame.
        * @command/disable say now disables " as well. The same applies
          to other single-character command forms. If you disable SAY,
          commands of the form "hi! are rewritten as: say hi! before
          being passed to the checker for user-defined commands
          so you need only set up $say *: to catch both. %c will, as always,
          contain the raw command as entered (i.e. "hi!). Aliases
          (like 'p' for page) are treated similarly when the aliased
          command is disabled -- you need only match $page *. [TN]
        * The Huffman compression algorithm is now 8-bit clean, in 
          preparation for a future internationalization of PennMUSH
          (Eh? Dite "help" pour aide. :) In addition, none of the compression
          algorithms treat the first character of a compressed string
          specially anymore -- they don't have to. [TAP]
        * The customize.pl script no longer copies over all the distribution
          help files from game/txt/hlp. Instead it makes customdir/txt/hlp
          into a link to game/txt/hlp, which is a good thing when future
          patches update the help files. Dedicated to Oleo.

Fixes:
        * @list/attribs showed many duplicate attribute names.
          Reported by John Hutchinson.
        * Fixed a mislabeling of allocated memory by htab.c, so mem_check
          stats will be correct.
        * @channel/gag now works.


& 1.7.0p5
Version 1.7.0 patchlevel 5                    October 1, 1997

Minor Changes:
        * New os2/ subdirectory with information for those looking to
          build under OS2. Maintained by Sylvia (penn-os2@pennmush.tinymush.org)

Fixes:
        * Examine/brief could sometimes cause crashes. Reported by
          Sean Fike. [TN]
        * cmds.c and command.c didn't do the right #includes for the
          original chat system. Reported by Magus.
        * Added help for @shutdown/paranoid. Reported by Sean Fike
        * @chan/decompile on a nonexistant channel didn't return an
          error. Reported by Mike Wesson


& 1.7.0p4
Version 1.7.0 patchlevel 4                    September 19, 1997

New command:
        * The @shutdown command now takes a /paranoid switch
          to perform a paranoid dump when shutting down
          (or rebooting, if given with /reboot as well). Idea by Flame.

New options:
        * You can define the MAILER option in dune.h to be
          something other than sendmail if you want to put a
          wrapper around the mailing program used to send out
          passwords to players using the 'register' command.
        * If you define LOCAL_DATA in options.h, you can 
          use functions in local.c to maintain your own data structures
          associated with each db object. [TN]
        * If you define the TINY_TRIM_ORDER option in dune.h,
          the trim() function takes arguments like TinyMUSH's.
        * If you define ANSI_JUSTIFY in options.h, the rjust, ljust,
          and center functions will ignore ansi codes when computing
          where the string should be placed, so they'll work right for
          strings with ansi. Wadhah Al-Tailji contributed a patch
          for this concept. TN wrote this particular implementation.

Fixes:
        * rnum() didn't find exits properly. Reported by Vedui.
        * Null channels would get added if the chatdb's channel count
          got unsync'd with the actual number of channels in the chatdb.
          Reported by Matt@New England: The Reckoning.
        * @wcheck/all didn't work. Report by Wolverine@Holodeck1
        * HPUX needs _XOPEN_SOURCE_EXTENDED in the hints. Report by Angel.
        * db reading error messages are slightly more verbose.
          Suggested by Flame.
        * Mortals examining DARK rooms don't see contents anymore.
          Report by Jonas Oberg. [TN]
        * Attribute names may no longer contain the caret (^) character.
          It's a security risk. Noted by Rob Wilson.
        * hdrs/funs.h was being appended to, not rebuilt. Noted
          by John Hutchinson.
        * setunion fixed again, so that setunion(a a,) correctly
          returns 'a', not 'a a'. [TN]
        * Various references to mellers1 updated to pennmush.tinymush.org.
        * COPYRITE file added to explain a couple of the unclear
          points in hdrs/copyrite.h and to serve as a pointer.
        * @chan/rename didnt work. Reported by Jonathan Booth.
        * Help for entrances() updated by Naomi Novik
        * Players no longer hear about all the channels they're
          no longer gagged on when they disconnect. Report by
          Naomi Novik.
        * The time noted in the LAST attribute now will always
          have day numbers 01-31 instead of 1-31, just like time()
          does. This makes convtime() work better on LAST for some
          systems. Reported by Valin@PernMUSH.
        * MUSHcoding a command called $attr * would crash the MUSH.
          Fixed. Reported by Sam Knowlton. [TN]
        * Disabling say now disables ", (same for pose, semipose,
          emit, and chat and their corresponding tokens).
          Reported by Flame.
        * The hint for Dec Alpha OSF now indicates that you need to
          use native malloc. Reported by Sean Fike.
        * We now check for the assert() macro in Configure. NetBSD may
          not have it, according to Logan Five.
        * Doing a LOGOUT after a @shutdown/reboot caused crashes
          because mail pointers weren't being reset.


& 1.7.0p3
Version 1.7.0 patchlevel 3                    August 13, 1997

Fixes:
        * setunion(,list) should work now.
        * @wall/wizard and @wall/royalty work right. Report by Alan T. [TN]


& 1.7.0p2
Version 1.7.0 patchlevel 2                    August 12, 1997

Fixes:
        * Linux 2 is now instructed not to use nm to find objects
          in libraries since its nm output doesn't seem to be
          BSD compatible or something.
        * Compile with CSRI malloc in debugging mode didn't work.
          Reported by TwinSuns MUSH.
        * Exits in transparent rooms with COMMA_EXIT_LIST had
          vanished. They're back! [TN]
        * More command parser bugs ironed out. [TN]
        * 'e' is examine, 'b' is brief, 'w' is whisper
           (unless you reserve them). [TN]
        * @config said conflicting things about possessive get.
          Report by Jonas Oberg.
        * When not using @prefix, audible messages were prefixed
          with "From <source>" instead of "From <source>,".
          Fixed. Report by Jonas Oberg.


& 1.7.0p1
Version 1.7.0 patchlevel 1                    August 7, 1997

Minor Changes:
        * New file local.c (from local.dst) makes more local hooks
          available. Some of the hooks in command.c have been moved
          here, so you may have to mess around a bit if you've already
          added things in command.c's local_startup or local_shutdown. [TN]
        * Functions can now be defined and added all within funlocal.c
          so you don't have to muck with the function.c table. [TN]

Fixes:
        * restrict_command didn't restrict commands to God correctly.
          Reported by Jason Newquist.
        * @command indicates if commands are restricted to God.
        * When COMMA_EXIT_LIST was defined, rooms with no exits
          still showed the "Obvious Exits:" message. Report by Michael Rudel.
        * Partial switch-matching for commands is back.
          And CMD_T_NEWSTYLE is gone. [TN]
        * Makefile doesn't clobber existing funlocal.c/cmdlocal.c
          any more. Report by Jason Young.
        * inv wasn't working for inventory, and other command aliasing
          flaws are fixed. Report by Corum. [TN]
        * MUSH wouldn't compile if PLAYER_LOCATE wasn't defined. Fixed.
          Report by Alan T.
        * Some leftover defines removed from game.c and mushcnf.dst
        * @lock didn't parse right. Fixed. Report by Corum.


& 1.7.0p0
Version 1.7.0 patchlevel 0                    July 31, 1997

The major goals of this release are to make what used to be
compile-time options into run-time options, and improve a number
of internals.

Major Changes:  

        * The hashtable functions from TinyMUSH (htab.c/htab.h) are
          now used by PennMUSH (with permission), so instead of 
          every subsystem writing its own hashtable code, they now
          all use the standard code.

        * The giant switch in game.c has been replaced by hashtabled
          commands. [TN] 
          Groovy new features:
          * @command/enable and @command/disable for any command
          * Multiple switches (@pemit/noeval/silent) work
          * The left side of the = is always evaluated before
            the right (previously, this was compiler-dependent).
          * Command table is built during compilation, and there's 
            a standardized command interface, so adding commands
            is easier.
          * local.c contains hooks for local routines to run
            on startup and shutdown, and to use to add new commands.

        * Configuration options which restricted or disabled commands
          (READ, NO_KILL, ROBBERS, HATE_TOAD, ROY_FIND, HARSH_GUEST,
          SITELOCK_COMMAND) have been replaced the 'restrict_command'
          directive in mush.cnf. Check there and be sure things are
          set the way you want them!

        * Commands may be overridden by completely disabling them,
          and providing a MUSHcoded version instead.
            
        * Ident and DNS lookups are handled by a slave process
          if possible. [TAP]

        * The help files have been rewritten by Naomi Novik!

        * The MUSH now closes and reopens the log files when it
          receives a SIGHUP signal. [TAP]

        * @shutdown/reboot will dump the database and restart the
          MUSH without disconnecting the players. So will a USR1 signal.
          Good for patching in new source code on the fly. Based on the 
          patch by Cro@Spaceballs which is itself based on ideas from
          TinyMUX. This may be nonportable - if it fails on your OS, 
          pennmush-bugs@pennmush.tinymush.org would like to hear about it. 
          [TAP]

New commands:
        * @command (see above)
        * @list/commands
        * @attribute, similar to Tinymush (but doesn't save data
          across shutdowns at this point, so you've got to use it
          on an @startup!). Also @list/attribs.
        * @function/delete 
        * @channel/gag <channel>=<yes|no>, keeps you on the channel
          (preserving your title, etc.) but silences it so you don't 
          hear messages. The channel is automatically ungagged if
          you log out from the MUSH.
        * @conformat and @exitformat allow custom-formatted Contents:
          and exit lists. [2.2,TAP]

Minor Changes:
        * Configure now looks for libbind.a, the BIND 8.1 library
        * @config shows more of the configuration options
        * @mail/unfolder <folder> can be used to remove a mailfolder's name.
          Suggested by Julianna Barrenson.
        * The default malloc is now CSRImalloc, which is now distributed
          in a single-file form with the MUSH. 
        * The MALLOC define in src/Makefile has been removed.
          Unlike MALLOC_D and MALLOC_O, it didn't do anything.
        * The "CHANGES" file now contains only the current
          version's changes. Older changes are in the 
          "CHANGES.OLD" file.
        * The attribute flag AF_ODARK is now assumed to be default, 
          and is thus no longer used or stored. Instead, AF_VISUAL
          is used to indicate a visual attribute (previously, this
          was indicated by the absence of AF_ODARK). To note this
          change in the db, a new DBF constant, DBF_AF_VISUAL,
          has been defined.
        * Code for "privilege tables" (like chat channel privs, 
          attribute flags, etc.) has been centralized into privtab.c

Fixes: 
        * Locks on zone exits now evaluate with the right enactor.
          Problem noted by Leonid Korogodsky. [TAP]
        * Win32 compatibility improvements. [TAP]
        * Prefer limits.h to values.h. Suggested by Atuarre.
        * SIGCHLD and SIGCLD now both work. Noted by Naomi Novik
        * If you idle out and get hidden, only the idle descriptor
          should get hidden. Noted by Gepht@Hemlock
        * With DBF_LESS_GARBAGE, garbage objects were loaded with
          owner NOTHING instead of owner GOD, which could cause
          crashes in the @mail code. Reported by Harvester@StarWars.
        * Problems with getrandom() on some systems fixed.
        * Help for dist3d() clarified. Reported by 
          Kova'khan@Among the Stars TrekMUSH via Leo at the same MUSH.
        * You may now use power() for integral powers of negative
          numbers. Suggested by John Hutchinson.
        * setunion(,test,|) used to return |test, now returns test.
          Reported by Ashford @ V MUSH
        * SAFER_UFUN now blocks non-God eval'ing a u() on God.
          Reported by MRR@ATS
        * Building with SunOS cc and COMPRESSION_TYPE 0 works now. 
          Reported by Jonas Oberg.

Personnel Changes:
        * Ralph Melton has retired as a member of the PennMUSH 
          devteam. Alex and Javelin send him best wishes and big
          thanks for all his work. Replacing Ralph will be
          Thorvald Natvig. Welcome aboard, TN!

& 1.6.10p6
Version 1.6.10 patchlevel 6		      May 11, 1997

Fixes:
	* inc() and dec() didn't work right with NULL_EQ_ZERO.
	  Fixed. Report by Dennis DeMarco


& 1.6.10p5
Version 1.6.10 patchlevel 5                 April 29, 1997

New Commands:
        * @channel/title sets a player's title for a channel.
          The title appears prepended to their name.
          I forgot this, and Thorvald Natvig noticed.

Minor Changes:
        * The inc() and dec() functions can now increment and
          decrement strings that end in integers. For example:
          inc(LINE_10) => LINE_11
          inc(LINE-10) => LINE-9   (incrementing -10)
          inc(LINE1.9) => LINE1.10 (incrementing the 9)
        * The LOWER_MATH option has been removed. Everybody
          gets shr(), shl(), inc(), and dec().
        * New attributes OIDESCRIBE and AIDESCRIBE do what you'd 
          expect for the internal descs of objects. Suggested
          by Stacy Robinson.
        * @chan/on by a Wizard always succeeds, even if there's a 
          join lock. Suggested by Mike Wesson.
        * Enhanced protection against malicious ANSI codes.
        * @channel/decomp displays locks in a better format.
          Suggested by Naomi Novik.
        * Numbers are now checked to be sure they're not so
          large as to bring down the system, at least in theory.
          Suggested by Atuarre.
        * Configure rebuilt under dist-3.0 pl70.
        * queue_write has been modified to reduce the number of
          packets sent out on the net; it only sends when needful
          and lets the usual output loop handle most output.
          The many packets issue was noted by Doogie.
        * All references to "parent rooms" have been changed to
          "zone master rooms" for clarification. Noted by Jonas Oberg.

Fixes: 
        * Long output should no longer cause NeXT
          systems to disconnect the user. Fix by Mike Kienenberger
        * Long output should no longer cause Win32 systems to
          disconnect, but it will throw out the beginning of 
          the output. Fix by Hans Engelen.
        * Bad objects on chat channels are now removed when the
          chatdb is loaded. Suggested by Dennis De Marco.
        * help for last() added. Report by Flame.
        * Objects couldn't be added to object channels. Fixed.
        * If a site matched in access.cnf, but didn't specify 
          a certain access rule, a later matching site could. This
          is bad for 'register', and not what was intended (that
          a matching site completely controls that site's access).
          Now fixed. Report by William Browning.
        * If you're on a channel but don't pass the see-lock,
          @chan/who returns a better error. Report by Cro.
        * help for remove() now mentions delimiters. Noted by J. Wilcox.
        * All tabs in helpfiles replaced with spaces. [TAP]
        * Loading a db that didn't have garbage objects stored
          caused a slew of warnings about null names. Should be fixed
          now. Reported by Atuarre.
        * FreeBSD hints improved, thanks to Atuarre and Doogie.


& 1.6.10p4
Version 1.6.10 patchlevel 4                 March 3, 1997

Major Changes:
        * The disk db can now be dumped without including GARBAGE
          objects, which may make it somewhat smaller. [TAP]

Minor Changes:
        * The %? substitution returns the current function invocation
          count and recursion depth as two space-separated numbers. [TAP]
        * dig() can take a single argument instead of 3.

Fixes:
        * set(obj/attr,flag) no longer says "Set" when the object or
          player is QUIET. Reported by Graywolf.
        * Search_All players couldn't use @search. Now they can.
          Reported by Cro.
        * lnum(2,1) didn't work right, and things were broken with
          floating point args to lnum. Fixed.


& 1.6.10p3
Version 1.6.10 patchlevel 3              February 9, 1997

New function:
        * graball() as per TinyMUSH 2.2. [TAP]

Fixes:
        * On some systems, make clean would go into an infinite loop
          if src/CSRI didn't exist. This should now be fixed.
          Report by Cro@Spaceballs.
        * Restart script now looks for minimal.db.gz if minimal.db.Z
          can't be found. This helps people running under Mklinux
          on Power Macs(!). Report by Jason Newquist.
        * Fix to matchall(). [TAP]
        * move.o doesn't compile if FIXED_FLAG isn't defined.
          Noted by Andy Jalics.



& 1.6.10p2
Version 1.6.10 patchlevel 2              February 2, 1997

Minor Changes:
        * If forking to do dumps, lower the priority of the dumping 
          process to keep the parent process more responsive.
          Based on a patch by Doogie@ATS TrekMUSH.

Fixes:
        * Code cleanup and fixes to comp_w.c. Problems reported by
          Mike@TBFF
        * Portability fixes for alpha-linux systems. Thanks to Roger
          Chen for facilities to work on this.
        * Added help for @dump/debug. Report by Flame.
        * Note added to game/txt/Makefile about braindead Irix 6.2 make
        * Ident source files now do better #ifdef'ing of Unix include
          files to help out Win32. 
        * Configure changes to enhance portability.


& 1.6.10p1
Version 1.6.10 patchlevel 1              January 25, 1997


Commands: 
        * New command: @dump/debug. Like @dump/paranoid, but
          it also tries to fix the memory db, so a shutdown/restart
          may not be necessary. It is never forked. Suggested by Atuarre.

Fixes:
        * externs.h now declares crypt() as char *, not const char *.
        * free_access_list's declaration is now K&R compatible again.
        * repeat() now doesn't work with a null string, which prevents
          a denial of service attack. Report by Atuarre. [TAP]
        * Fencepost error in huffman compression code fixed.
          Report by Mike Wesson. [TAP]
        * idlesecs() is now referenced in pennfunc.hlp. Report by Flame.
        * parse() is now referenced in pennfunc.hlp. Report by Sandi Fallon.
        * lsearch() now gives the correct types in the help.
          Report by Sandi Fallon.
        * Halted messages now indicate the object that was halted,
          even if they are halted as the result of a chown.
          Report by Sandi Fallon.

& 1.6.10p0
Version 1.6.10 patchlevel 0              December 16, 1996

Major Changes:
        * The attribute matching order has been cleaned up. Code by [TAP]
          If you do ex obj/attribpattern, and...
          1. If attribpattern has no wildcards:
             a. Return attribpattern's value if set, else
             b. Return the value of an aliased attribute, if any.
          2. If attribpatern has wildcards:
             a. Return anything which matches the pattern, and
                don't bother about aliases.

        Here's a little example:
                       only DESC set   only DESCRIBE set    both set
  ex foo/desc          DESC            DESCRIBE             DESC
  ex foo/desc*         DESC            DESCRIBE             both
  ex foo/describe      (error)         DESCRIBE             DESCRIBE


Minor Changes:
        * parse() is now an alias for iter() [TAP]
        * Attribute set/clears report the name of the attribute in the
          set/cleared message. [TAP]
        * fun_lattr is now in fundb.c. [TAP]
        * Improved setq/setr help. [TAP]

Fixes:
        * Typo in help evaluations corrected. [RLM]
        * The side-effect version of lock() no longer returns a value.
          Reported by Corum.
        * help quota() added. Report by Dennis De Marco.
        * help INHERIT updated to reflect current control structure.
          Suggested by Vedui.
        * vmul() with a separator now returns the vector separated with
          that separator, as promised. Report by Atuarre@TrekMUSH.
        * FIXED now overrides STICKY, so you can't set yourself STICKY,
          get yourself dropped, and go home. Report by Anthony Ivan.
        * lsearch(all,flags,c) worked, but lsearch(all,flags,Pc) didn't!
          This is fixed. Report by Flame.

& 1.6.9p9
Version 1.6.9 patchlevel 9               November 18, 1996

Fixes:
        * A Wizard doing @find on a MUSH with garbage crashes the MUSH.
          Fixed. [TAP]
        * Fairly major security problem due to a typo in the player-
          destruction code fixed. Reported by Dennis DeMarco.


& 1.6.9p8
Version 1.6.9 patchlevel 8               November 10, 1996

Major Changes:
        * The control system has changed slightly: only wizards
          control wizobjects and only royalty control royobjects.
          If a mortal's object gets wizbitted, the mortal will
          cease to control it. Also, protection is now afforded
          to players from non-inherit objects.

Fixes:
        * Setting an @listen on a room caused a crash. Fixed.
          (Note: @listen on rooms still doesn't work - it's not
           supposed to -- use LISTENER and ^patterns -- but at
           least it doesn't crash. :)  Report by Flame@B5.
        * dune.h.dist now defaults the index and rules indx files
          to ending in .idx, as they should. Noted by Jason Newquist.



& 1.6.9p7
Version 1.6.9 patchlevel 7               October 30, 1996

Functions:
        * The help for vmul() suggested it did an elementwise product
          of 2 vectors, returning a vector. In fact, it was doing a
          dot product (sum of the elementwise product, which is a scalar).
          vmul() now does what the help suggests, and vdot() does
          a dot product.

Fixes:
        * Bug in comp_w.c (word-based compression) which could cause
          loss of subjects in @mail has been fixed. [NJG]
        * Help for "control" made more explicit, and help for "controls()"
          references "control", not "controls".
        * @wait 0 now queues its subject immediately, rather than waiting
          1 second. [TAP]
        * The "Patchlevel" file is now more grammatical. For Sam Knowlton. :)
        * Variables named "listen" have been renamed "listener" to
          remove compiler warnings about shadowing the listen() system call.
          Reported by Flame@B5


& 1.6.9p6
Version 1.6.9 patchlevel 6               October 24, 1996

Fixes:
        * Removed needless calls to tprintf() within do_log() in 
          access.c
        * Fixed the variable j in fun_lnum to be the right type


& 1.6.9p5
Version 1.6.9 patchlevel 5               October 15, 1996

Options:
        * COMMA_EXIT_LIST causes exit lists to be comma-separated,
          and include the word "and" before the last exit. [NJG]

Functions:
        * lnum() with multiple arguments now behaves exactly like
          Tiny 2.2's lnum().

Minor Changes:

        * @pcreate failure messages distinguish between bad passwords
          and bad names. Related to a suggestion by Philip Mak.

Fixes:
        * elements() used to put a leading space in output. Fixed. [RLM]
        * index(foo|||,|,2,1) now returns nothing, instead of ||,
          as it should. Fix by Harvester@StarWarsMUSH.
        * @cpattr a/DESC=b (where a has a DESCRIBE attribute and no DESC
          attribute) correctly grabbed DESCRIBE from a, but copied it to
          DESC on b. This is now fixed. [TAP]
        * Various unused variables and missing prototypes fixed. [NJG]
        * More win32 fixes. [NJG]
        * Revised comp_w.c to handle table overflow better. [NJG]
        * splice() wasn't putting spaces back in between words.
          Reported by Philip Mak.
        * Help for aposs() was never added. [MPC]
        * mkindx doesn't compile on systems without strcasecmp. Fixed.
          Reported by Stephen Sanderlin.
        * Configure: -lsocket is used if it's found (also -lcrypt, -lnsl)
        * Various missing includes fixed
        * Linux systems weren't doing daylight savings time right.
          We now always try to use tm_isdst = -1 to get this right.



& 1.6.9p4
Version 1.6.9 patchlevel 4               October 9, 1996

Fixes:
        * Restart script fix in 1.6.9p3 is buggy. Fixed the fix.


& 1.6.9p3
Version 1.6.9 patchlevel 3               October 7, 1996

Changes:
        * @wipe/wipe() of a single attribute (no wildcards) no longer
          checks the SAFE flag on the object.
        * Wildcards are now accepted for the attribute name when setting
          attribute flags.

Fixes:
        * @succ and &succ could create duplicate success attributes.
          Fixed so that @succ -> SUCCESS and &succ -> SUCC,
          and no more duplicates. [TAP]
        * Help for @purge had disappeared. Back.
        * Forgot to include restart patch mentioned in 1.6.9p2 [PeaK]


& 1.6.9p2
Version 1.6.9 patchlevel 2               October 5, 1996

New Compile Options:

        * The behavior of attributes is now configurable; you can
          emulate attribute setting behavior from 1.6.8 and earlier,
          use the currently recommended settings, or anywhere 
          in between. [TAP]

Functions:

        * lnum() now takes an optional second argument, which is the
          number to start with, e.g. lnum(3,4) => 4 5 6
          Suggested by [MPC]

Fixes:
        * @mail/debug clear=<player> now clears all the player's
          mail, not just their current folder. Fix by
          Leonid Korogodsky.
        * look/outside at an ambiguous name crashed. Report by Vedui.
        * New hints file: linux_2.sh
        * Help for setq() now included. Report by Flame@Babylon5
        * Added -w to the ps in restart so the output isn't
          truncated. [PeaK]
        * Restart changes to prevent some race conditions under Linux 2.0
          [Peak]


& 1.6.9p1
Version 1.6.9 patchlevel 1               September 26, 1996

New Function:

        * setr() is like setq() but returns the string as well.
          It's identical to [setq(#,string)]%q#. Suggested by Adam Dray.

Fixes:

        * Bug with @clone fixed. Report by Vedui.
        * Bug with @mail folder 15 fixed. Report by Vedui.
        * @sitelock/register worked backward. Fixed. Report by [MPC]
        * rnum() now requires that you can examine the room.
          By Jason Rhodes, with minor mods.
        * Better messages when a player or thing is set audible.
          Suggested by Babylon5@kuwait.net
        * Configure now uses your email address instead of your name
          when trying to subscribe to the mailing list; on some systems,
          it's hard to get a valid name -- getting an email address
          is usually possible. Suggested by Cro@Spaceballs
        * Configure no longer adds multiple copies of the same gcc
          warning flags when you run it again. Reported by Cro@Spaceballs

& 1.6.9p0
Version 1.6.9 patchlevel 0               September 16, 1996

Attribute Rewrite [TAP]:

        * There is now a distinction between an empty attribute and
          a non-existant attribute:
                @va me          <--- wipes out my VA attribute
                @va me=         <--- sets my VA attribute to be empty
          Empty attributes retain their locks and flags; wiped attributes
          are gone forever.
        * @set and set() can not wipe out attributes. @wipe and wipe()
          will.
        * You can now include ':'s in $-command and ^-command patterns
          by escaping them with '\'.
        * Standard attribute names are kept in a string table and
          memory is not allocated for them. We guesstimate a 3-5%
          savings in memory use from this change.
        * objmem() and playermem() are now more accurate.
        * Internal changes: new attribute flags AF_STATIC, AF_COMMAND,
          AF_LISTEN; atr_comm_match doesn't look directly at compressed
          strings any more; restructured some routines (atr_clr to clear
          attributes, atr_add to set them).

Fixes:
        
        * Add help topic SETTING-ATTRIBUTES to explain the above.
        * Fixed small error with closing a NULL file in access.c [TAP]
        * Improved help for @destroy
        * Dashed lines in @mail are now 2 hyphens longer. [MPC]
        * The Configure hints files weren't properly used when
          compiling with gcc.
        * The color flag is now aliased to colour as well. [MPC]
        * With MAIL_SUBJECTS, the @mail/list could get scrambled
          for messages from players with long names. Reported by
          Leto@DuneII.
        * Small memory leak when access.cnf is reloaded via kill -HUP
          has been fixed.
        * Vestige of old TEMPLE code removed from do_drop. Reported
          by Mike Selewski.

& 1.6.8p1
Version 1.6.8 patchlevel 1               September 7, 1996

Fixes:
        * The mail*() functions were broken due to a typo. [MPC]
        * The addr field in the descriptor structure has been expanded
          from 50 characters to 100 characters, because you'd really
          like to store the entire ident response from encrypting
          ident daemons.
        * The MAIL: announcement at login now counts your cleared
          mail in your mail totals, in case something clears mail for
          you while you're offline. Suggested by Mike Wesson.
        * Better string protection for parse_chat which may fix
          a potential crash when speaking on +channels.

& 1.6.8p0
Version 1.6.8 patchlevel 0               September 3, 1996

This is intended as a maintenance release because 1.6.7 has had
many rapid patches to achieve stability.

Fixes:
        * "make install" now implies "make all". Corrects a problem
          with not remaking hdrs/buildinf.h.
        * README file now shows the utils directory in its directory tree.
          Reported by Mike@StarWars.
        * On startup, PennMUSH now logs its version information.
        * @log/wiz was logging to trace log, not wiz log. Reported by
          Dean Moore.
        * @mail system behaved badly if you @shutdown on an empty
          maildb on some systems. Reported by Mike Selewski.
        * Detection of getpagesize() system call is now handled by 
          Configure. Fixes problems on Irix, reported by Mike Selewski. 
        * Minor typo in Irix hints file fixed.
        * Stupid misspelling of August in CHANGES-10 fixed.

& 1.6.7p6
Version 1.6.7 patchlevel 6               August 31, 1996

Fixes:
        * The attribute clear fix in 1.6.7p5 is buggy. Now it's really
          fixed. Report by [MPC].


& 1.6.7p5
Version 1.6.7 patchlevel 5               August 30, 1996

Fixes:
        * Sites not listed in the access.cnf file should have been
          allowed, not denied access. Fixed. Best report by Cwilla@Victory
        * A little more info in mush.cnf about how player_creation and
          access.cnf interact
        * Trying to clear a never-existant attribute got the right
          error message, but clearing an attribute that had existed,
          but been already cleared got the "Foo - Set." message.
          Fixed - atr_add now skips disposed attributes.  Report by [MPC]


& 1.6.7p4
Version 1.6.7 patchlevel 4               August 28, 1996

Fixes:
        * Bug in mail functions that caused mail(1:0) to crash
          has been fixed. Reported by Corum@StormWorld.
        * Another Win32 fix by Pat Pinatiello.


& 1.6.7p3
Version 1.6.7 patchlevel 3               August 28, 1996

Fixes:
        * Configure wasn't setting HAS_SENDMAIL correctly because the
          updated config_h.SH wasn't included in the diff!
        * @mail/clear's message about unread mail was screwy.


& 1.6.7p2
Version 1.6.7 patchlevel 2               August 27, 1996

Fixes:
        * Forbidden_Site wasn't working quite right
        * Win32 compatibility improvements suggested by Pat Pinatiello.
          Hopefully, no further real hacking should be required to 
          build under Win32 with Visual C++. Pat's instructions included
          as win32/README.visualc++


& 1.6.7p1
Version 1.6.7 patchlevel 1               August 27, 1996

Fixes:
        * #ifdef's and the like were missing which prevent compilation
          unless HAS_SENDMAIL and CHAT_SYSTEM (>2) were defined.
          Fixed by [TAP].


& 1.6.7p0
Version 1.6.7 patchlevel 0               Augest 22, 1996

Major Changes:

        * The lockout.cnf and sites.cnf files are no longer used.
          Instead, the file game/access.cnf controls all aspects of
          site-based (or, with ident, possibly user-based) access.
          Sites can be explicitly allowed or denied the ability to:
            * Connect to guest players
            * Connect to non-guest players
            * Create players
          Sites can be configured to:
            * Use email registration (see below)
            * Set all players from the site SUSPECT
          See the file game/access.README for file format information.
          The LOCKOUT and WCREATE defines have been removed from options.h.

        * A new access option, email registration, is available.
          From the connection screen, the command
            register <player> <email address>
          will create the player with a random password, which will be
          emailed to the address. The email address is stored on the player
          in the wiz-only attribute REGISTERED_EMAIL. 
          Obviously, this requires that the system have a way to send email.
          Ideas in this code came from Jim Cook.

        * @powers are now tabled in flags.c.

        * Nick Gammon's word-based compression algorithm is now
          COMPRESSION_TYPE 3. This algorithm may be faster than
          Huffman on the whole, and may provide better compression
          for large (>1.5Mb of text) databases.

        * @mail message-lists now understand the format [folder#:]msg[-msg]
          For example, the first 3 messages in folder 1 are 1:1-3.
          @mail commands that are not given any message list are assumed
          to apply to all messages in the current folder. You can also
          do this explicitly by using the word "folder". When you use
          the word "all", you match all messages in all folders.
          For example, try: @mail all
          @mail internals rewritten to increase code reuse.

New Commands:

        * @sitelock has got an additional syntax to support the new
          access.cnf system.

New Functions:

        * powers() returns the list of powers set on a thing.
          If HASPOWER_RESTRICTED is defined, you must be able to
          examine the thing to do this.
        * mail(), mailtime(), mailstatus(), and mailfrom() now accept
          this syntax:
                mail([<player>,] [<folder #>:]<message #>)
        * cemit() does what you'd expect. Suggested by [MPC].

New Powers:

        * Open_Anywhere power allows the player to open an exit between
          to any room, even if the player does not control the source
          or target room.


Minor Changes:

        * Previously, a player with the Halt power could use
          @halt obj=command to effectively @force any object.
          This form of @halt is now only allowed if you control the
          object. Bug reported by Flame.

        * When EXTENDED_ANSI is defined, ansi codes are stripped out
          of strings before checking them against LISTEN and ^patterns.
          Suggested by Mike Wesson.

        * HAVEN players are no longer notified when they send back
          an @haven message in response to a page. Page-locked players
          still are. Suggested by Naomi Novik.

        * @decompile me results in a decompile with "me" as the object name
          @decompile <player> results in the player's name as the object name
          @decompile of an exit will use the exit's short name instead of
          its full name for setting attributes and flags. 

        * Utilty scripts (customize.pl, update.pl, update-cnf.pl, 
          fixdepend.pl, and make_access_cnf.sh) are now in the utils/
          subdirectory.

        * Default rwho server is now littlewood.math.okstate.edu,
          which replaces riemann, which has been turned off.

        * time() and convsecs() now indicate the first 9 days of the
          month as 01..09, rather than 1-9, which makes convtime()
          happier when you convert back.

        * You may @tel an exit back into its own room. Added for
          compatibility with other MUSH flavors. Suggestion by Philip Mak.

        * Dark connections are now broadcast only to MONITOR wizards and
          royalty. This involved replacing the raw_broadcast and
          toggle_broadcast functions with a new flag_broadcast function
          which subsumes them. Suggestion by Philip Mak.

Fixes:
        * Noted the 256-character limit on channel descriptions in the help.
        * abs() now deals correctly with floating points.
        * Win32 compatibility improvements suggested by Pat Pinatiello.
        * Updates to BUGS, README.Deprecated, and FAQ [TAP]
        * An ANSI_NORMAL is sent at the end of the Doing message in WHO.
        * mail() and related functions now accept "me". Bug noted by
          Mike@TBFF
        * Help for @squota no longer says that it works like @quota
          when no limit is given, because it doesn't. 
        * Bigram compression was not freeing memory that it used
          for initialization. Fixed, and made faster.
        * Help for @unlink fixed; you can't pick up unlinked exits. [TAP]
        * Potential string overflow in new_connection fixed. Idea by [TAP]
        * Code cleanup: many old sections that were commented out
          with #ifdef NEVER ... #endif have been removed.
        * @set obj=!going gave an error message but still reset the flag.
          Now it should just give the error. Reported by Philip Mak.

& 1.6.6p0
Version 1.6.6 patchlevel 0               July 28, 1996

This version involves primarily cleaning up and streamlining code
in preparation for major internal changes in later releases.

Major Changes:
        * The following options are now standard and no longer turned
          on via dune.h/options.h: RALPH_LOCKS, EXTENDED_MAIL, 
          INHERIT_FLAG. [TAP]

New Commands:
        * @firstexit command moves an exit to be first in the list of 
          a room's exits. Based on contrib/topexit.165p3 by Marlek@Earth1996
          (but note that it requires control over the *room*, not the
          exit).

New Functions:
        * poll() returns the current poll. By William Knopes.

Flags:
        * TEMPLE flag has been removed. This requires adding a new
          DBF bit. [TAP]

Minor Changes:
        * Admin no longer automatically pass leave-locks and NO_LEAVE.
          Suggested by Naomi Novik. [TAP]

Fixes:
        * Users could cause an infinite loop with @mail/fwd. Fixed.
        * The fix to pmatch() in 165p4 didn't quite do the job.
          Alex's does. [TAP]
        * @mail/stat commands now show correct number of cleared messages.
          Bug reported by [MPC]
        * Typo fixed in help for items() [MPC]
        * help for BUILDER now calls it a power, not a flag.


& 1.6.5p4
Version 1.6.5 patchlevel 4               July 9, 1996

New Functions:
        * entrances() works like @entrances, including the cost.
          Suggested by Julienna@TrekMUSH.

Commands:
        * whisper/list takes multiple recipients. Suggested by [MPC].

Minor Changes:
        * A DARK-reconnected message has been added. Idea by [MPC]
        * LFAIL/OLFAIL/ALFAIL attributes now control the message
          seen when a player fails to leave an object due to the
          NO_LEAVE flag or a leave-lock.  By Naomi Novik.

Fixes:
        * pmatch() on a DARK or hidden player by an unpriv'd player
          now returns #-1 (can't find the player).
        * inc(very_big_n) now works exactly like add(1,very_big_n) instead
          of returning a huge negative number. Same for dec(). 
          Reported by [MPC].
        * Fixed spelling of Tinyfugue in help @decompile. [MPC]
        * Documented the way hasflag() works a bit better to forestall
          a common confusion: why hasflag(me,r) doesn't check for the
          royalty flag.
        * If a player tries to join a channel she's already on but
          which has since been locked against her, she receives the
          already-on-channel message now instead of the can't-join
          message. Suggested by Cwilla@VictoryMUSH.
        * Compile-time information in @version has been expanded and
          made much more robust for systems whose make program is
          broken. We now create the file hdrs/buildinf.h at the
          beginning of each build, which contains the info.
        * WHO at the connect screen works correctly now even if 
          #0 is privileged. Bug reported by Doyce Testerman.


& 1.6.5p3
Version 1.6.5 patchlevel 3              June 29, 1996

New Command:

        * @shutdown/panic causes a panic dump and shutdown. God-only. [RLM]

Minor Changes:

        * When you destroy a room you don't own, the "wrecking ball"
          message now includes the name of the owner, like the messages
          when you destroy objects you don't own. Suggested by
          Matt Chatterley.
        * The channels() function, with no arguments, returns the
          list of all channels (which the player can see).

Fixes:
        * When you try to get an object that's not in your location,
          and POSSESSIVE_GET is not defined, you don't receive
          any message at all. Fixed by Thaddeus Parkinson.
        * DARK-disconnect messages now appear.
        * All calls to random changed to getrandom (except the one
          in getrandom!), and the prototype for random removed from
          utils.c, where it causes conflicts for at least OSF/1.
        * portmsg.c extensively hacked to use the autoconfiguration
          info so you can "make portmsg" on supported systems.
        * Help for mortal() and @mortal removed. [RLM]


& 1.6.5p2
Version 1.6.5 patchlevel 2              June 19, 1996

Fixes:
        * @grep didn't check to be sure you were allowed to see
          the attributes it searched. Reported by Mike Wesson.


& 1.6.5p1
Version 1.6.5 patchlevel 1              June 12, 1996

New Functions:
        * channels(dbref) returns the list of channel names that 
          dbref is on.

Fixes:
        * When paging player(s) with spaces in their names, the
          LASTPAGED attribute stores them with quotes around them,
          so that repaging will work.
        * @mail/fwd shows you how many players it successfully
          forwarded to. 
        * @chzone here=none produced a spurious message if here was
          Wiz/roy. Fixed. Reported by Matt Chatterley.
        * udefault failed to evaluate the arguments it passed to the
          attribute to be u'd. Reported by PeaK.
        * Added include of sys/types.h in ident code. Necessary for
          FreeBSD.
        * @chf would not return a Huh? Fix by Hemlock MUSH admin.
        
& 1.6.5p0
Version 1.6.5 patchlevel 0              June 2, 1996

Database:
        
        * The "One" character in minimal.db.Z (#1, aka God) is now
          distributed without a password. This takes care of people
          who don't have crypt(3) or have a modified one (FreeBSD),
          since you now log in without a password, and set one,
          and all is well.

Documentation:

        * README has been extensively updated.

Minor Changes:

        * When paging, LASTPAGED is set to the list of succesfully
          paged players' names, if any page was successful. This
          is how page/list always worked; now applies to normal page.
        * &foo obj = bar used to set FOO to " bar". Similarly, you
          could use page/noeval (or any speech command with /noeval)
          to page messages with initial spaces. For TinyMUSH compatibility,
          this is no longer possible; leading spaces are trimmed now. [TAP]
        * F_INTERNAL flags (like GOING) are now visible unless they're
          also F_DARK. [RLM]
        * When you @decomp obj/atr and atr doesn't exist, you now get
          a message about it. Suggested by Matt Chatterley.
        * PREFIX semantics now like INPREFIX (see 1.6.4p2) [TAP]

Fixes:

        * Bug in parse.c which could causes crashes fixed. Reported
          by Atuarre. [TAP]
        * On at least 2 systems, the system date was screwed up,
          which made updating dune.h and options.h still produce
          files younger than dune.h.dist and options.h.dist.
          This is not our fault, but we'll fix it anyway - now we
          touch dune.h.dist and options.h.dist before we update
          dune.h and options.h. 
        * @wiping a STARTUP attribute didn't reset the STARTUP flag. [TAP]
        * Fixed bugs in the freebsd hints.
        * All of a sudden, linux systems have started barfing on
          our declaration of signal() in externs.h. All right, if they
          want to play that way, we now test for this in Configure
          and don't declare it ourselves if it would break things.
        * Changed Amberyl's address in the source to lwl@digex.net
        * Somehow the fix for add(+1,0) got left out of 1.6.4. Back in. 
        * The ansi() function now produces underscore with "u", as
          advertised. [TAP]
        * Warning about discarding const in assignment fixed in game.c.

& 1.6.4p2
Version 1.6.4 patchlevel 2              May 14, 1996

Minor Changes:
        * At game startup, semaphores on all objects are cleared.
          Prevents objects from having leftover semaphore states after
          a shutdown. [TAP]
          INCOMPATIBILITY WARNING! If you have objects which expect
          to always have sempahore -1 (or something else), be sure
          that they do "@drain me; @notify me" in their STARTUP
          (as recommended in Amberyl's MUSH Manual).

Fixes:
        * @dump/paranoid produced db's with incorrect db flags
          when CHAT_SYSTEM was 3 or 4. Reported by Matt Chatterley.
        * Under certain conditions, one could get inside a ZMO using
          the "go" command. Fixed. [RLM]
        * A strcpy in fun_match is now a safe_str. [PeaK]
        * INPREFIX fixes: (1) no space if INPREFIX evals to a null string,
          (2) message to be prefixed is passed as %0, (3) %1-%9 are
          temporarily cleared. [TAP]


& 1.6.4p1
Version 1.6.4 patchlevel 1              May 11, 1996

Fixes:
        * Forgot to #ifdef MAIL_SUBJECTS around fun_mailsubject.
          Reported by Mercurial Mink@Protean.
        * Quirk in @dbck fixed. [RLM]
        * Possible denial of service attack using repeat() fixed. [RLM/TAP]
        * Problem with Configure script under certain conditions (esp FreeBSD)
          producing bad compiler flags fixed. Report by Mike Wilson.

& 1.6.4p0
Version 1.6.4 patchlevel 0              May 3, 1996

Major Changes:
        * eval_boolexp rewritten again. Important features:
          - If A is locked to @B, evaluating A's lock is identical
            to evaluating B's lock
          - To do an indirect lock or an elock(), you must be able to
            read the lock on the target object (i.e., you must be
            See_All, control the object, or it must be Visual)
            (New macros Can_Run_Lock and Can_Read_Lock for this)
          - As a result, channel locks will work as advertised if
            you indirect-lock them to VISUAL objects
        * Changes to handling of plain strings (with no evaluation)
          resulting in doubling of speed. [TAP]
        * If you fail the page-lock on a DARK player, you receive their
          AWAY message rather than their HAVEN message. That is,
          failing a page-lock on a DARK player is just like paging
          a DARK HAVEN player.
        * INHERIT check moved to controls() function

New functions:
        * mailsubject() returns subject of a given mail message,
          analogous to mail() and mailfrom(). By Atuarre.

Minor Changes:
        * Don't go through some major sections of the parser if we've
          be given PE_NOTHING. Performance boost. [TAP]
        * Players who are allowed to idle past inactivity limit, and
          are unfindable, and can hide, are hidden (as before), but
          only receive the notification once, instead of every
          hour (or whatever your limit is). Players who are all of the
          above but can't hide don't get any notification now.
          Suggested by Gepht@Hemlock
        * When allocating a new boolexp, set its struct members to
          null values for better debugging. [RLM]
        * We no longer save/restore the r-values when evaluating
          the left side of the equal sign in attribute setting.
          So @desc %q0 = %q0 now works as expected. Reported by PeaK.
        * Locks set when players are initially created (lock, elock)
          are now set to "=me" instead of "me". [PeaK]

Fixes:
        * When EX_PUBLIC_ATTRIBS wasn't defined, you never saw the
          DESCRIBE attribute listed when you examined objects. [AKM]
        * Vacation and Connected were being handled incorrectly
          internally; the type of object wasn't being checked. [TAP]
        * Now that Connected is fixed, the call to @doing doesn't have
          to prefilter for players, so don't. [TAP]
        * +nn is now considered a number, so add(+20,1) works.
          Reported by Dennis De Marco.
        * String boundary problems sometimes when you hit the 
          function recursion limit could cause crashes. Fixed.
          Reported by Oliver Stoll. [TAP]
        * Making on Linux should hopefully now work with -g. [PeaK]
        * Warning message when @chzoning an inherit player used
          to be announced when @chzoning *any* player. Fixed. [PeaK]


& 1.6.3p7
Version 1.6.3 patchlevel 7              April 25, 1996

Fixes:
        * beep() works without arguments now, as promised. [TAP]
        * repeat(string,-number) caused an infinite loop. Reported by
          Atuarre.
        * The create() function didn't accept a single argument. [RLM]
        * last(a b c) was returning " c" instead of "c". [TAP]
        * The Configure script did indeed send email to listproc if
          you asked to be subscribed to the pennmush mailing list.
          But it sent it with Precedence: junk, which listproc ignores.
          Fixed.
        * %q9 wasn't preserved due to a typo in function.c. Fixed. [PeaK]
        * SIGHUP now handled synchronously to prevent race conditions.
          Noted by PeaK.



& 1.6.3p6
Version 1.6.3 patchlevel 6              March 30, 1996

Minor Changes:
        * A channel's owner now always passes the channel's modlock.
        * Wizards may now do folderstats(player,folder). Previously
          on God could, but wizards could see the stats for the player's
          current folder, and could reset the current folder, so it
          doesn't make sense to restrict. Report by Cwilla@Victory-MUSH
        * @function is restricted to see_all players. Suggested by
          Oderus (Mike Wesson).

Fixes:
        * @sitelock/ban and @sitelock/register had their effects
          mixed up. Reported by Matt Chatterley.
        * Objects that were undestroyed were having the GOING flag
          removed but not the GOING_TWICE flag. Fixed. [RLM]
        * element() now works as advertised. [RLM]
        * Systems without IEEE math now can't do power(x,y) if
          *either* x or y is greater than 100. Report by InsaneJoseph@WoP



& 1.6.3p5
Version 1.6.3 patchlevel 5              March 12, 1996

New Powers:
        * The immortal power has been split into 3 powers:
          no_pay (has unlimited money), no_quota (has unlimited quota),
          and unkillable (can't be kill'd). For backwards compatibility,
          @set player=[!]immortal sets/unsets all three. Objects which
          were immortal before this patch will have all 3 flags set.

Minor Changes:
        * The DEBUG flag can now be set by any user. The Can_Debug power
          will automatically be removed from all objects.
        * The "directive not found" message in loading mush.cnf has been
          changed to a more comprehensible/less scary "directive in 
          cnf file ignored" message.

Fixes:
        * FIXED players can no longer "go home" or "move home"
        * index-files.pl was producing incorrectly titled index entries. [RLM]
        * More fixes to elock() and zone locks. Elock() should now work
          even when RALPH_LOCKS isn't defined. Zone locks are checked
          on the correct object. [TAP]
        * @open exit=variable should work correctly now. [TAP]


& 1.6.3p4
Version 1.6.3 patchlevel 4              February 27, 1996

Fixes:
        * Complex evaluation locks may be better behaved. [RLM]
        * ex/debug now shows flag bits in hex, not decimal [RLM]
        * % failed to quote the following character in some cases.
          Fixed to work like 1.50. [PeaK]
        * iter() only allowed a single-character output separator instead of
          an arbitrary string. Fixed. [PeaK]
        * Bug in extmail.c which caused crashes on find_exact_starting_point
          with newly created players may be fixed.
        * Repaging with page/list uses the correct format.
          Also, failing to page anyone successfully doesn't clobber
          LASTPAGED when using page/list.
        * Dark-connecting admin now trigger connection messages on
          admin chat channels (unless the channels are quiet)
        * Help for pos() corrected. 
        * Things starting with #- (error messages) are now treated as
          false (0) in boolean functions, as under 1.50. [TAP]
        * The recursive_member function was inefficient, and potentially
          buggy, which could allow things to be teleported into things
          they contained. Fixed.
        * @drain wasn't lowering QUEUE attrib. Fixed. [RLM]
        * Zone master help updated to refer to zone locks [RLM]
        * Memory malloc'd by replace string, though freed, didn't
          have its mem_check cleared in a few places, which could make
          it appear that replace_string was leaking. [PeaK]


& 1.6.3p3
Version 1.6.3 patchlevel 3              February 12, 1996

New option:
        * If NULL_EQ_ZERO is defined in dune.h, a null string will
          be considered a zero in a math function. For example,
          add(,3) will return 3, instead of #-1. 

Minor Changes:
        * Guests may not join or leave channels. [Mike Wesson, Oderus]

Fixes:
        * edefault() core dumps fixed.
        * eval() now behaves correctly. [TAP]
        * ALL players (inc. Wizards) now subject to BUILDING_LIMIT.
        * Quota now properly updated on object destruction. [RLM]
        * Misc. fixes to object destruction, especially in the case
          of what happens to SAFE objects of destroyed players. [RLM]
        * Queue was handled strangely for priv'd players. Fixed.
        * New internal macros NoQuota and NoKill, both the same as
          NoPay, established in preparation for future splitting of
          Immortal power into 3 powers.
        * help @clock2 typo fixed.


& 1.6.3p2
Version 1.6.3 patchlevel 2              February 7, 1996

[L@E] refers to Lukthil@ElendorMUSH, who did many patches to 1.50
that I'm just now getting to integrate.

Minor Changes:

        * Wizards are now effectively pemit_all
        * @dol/notify notifies even if given a null list. [L@E]
        * See_All players can see quotas with @quota. [L@E]
        * If we're logging forces, don't just log forces *by* wizards,
          log forces *of* wizards (and things they own) by anybody. 
          Idea by L@E.
        * Removed obsolete code: clear_atr_name
        * mkindx now sorts index entries alphabetically, so it
          doesn't matter what order you have get() and get_eval()
          in your help file - help get will give get().
          Code by Pavel Kankovsky (PeaK).

Fixes:
        * #-1 was being considered "true" instead of "false" when
          TINY22_BOOLEANS was not defined. [RLM]
        * munge() is better behaved when there are duplicates in the
          first list, accurately matching them with the second. [L@E]
        * Emits weren't propagating through audible exits when
          there was nobody in the room. Fix idea by L@E.
        * Charges were broken. Fix idea by L@E.
        * Immortal players could lose coins when their non-immortal
          objects ran code. Fixed. [L@E]
        * @edit is less likely to overflow buffers when using ^ and $. [L@E]
        * @halting objects used to queue them for #0. Fixed. [L@E]
        * Semaphores weren't removed when an object was halted. Fixed. [L@E]
        * Possible permissions problem in running STARTUP when objects
          are chowned fixed. [TAP]
        * make etags now picks up dune.h and options.h [RLM]
        * Code consolidation: chowning when an exit is linked is done
          via a call to chown_object now. [RLM]


& 1.6.3p1
Version 1.6.3 patchlevel 1              February 4, 1996


Minor Changes:

        * NO_LEAVE is now settable by anyone
        * The index-files.pl script indexes admin news and help separately.
        * *emit() functions can now have unescaped commas in their last
          argument (the message). [TAP]

Fixes:
        * lit() doesn't screw up on braces. [TAP]
        * @search and lsearch() using eval were broken. [TAP]
        * @unlock foo worked, and also gave a Huh?. Fixed. [RLM]
        * When a player was destroyed, their SAFE exits would be
          destroyed instead of chowned. Fixed. [RLM]


& 1.6.3p0
Version 1.6.3 patchlevel 0              January 31, 1996

Major Changes:

        * Assume that object A is locked to @B, and object B is
          locked to canuse/1. It used to be that when player P tried
          to pass the lock on A, the canuse attribute on *A* was
          checked, instead of B. Fixing that required that we check
          to be sure that B is allowed to evaluate the CANUSE attribute
          on A, which required internal changes to boolexp.c.

Minor Changes:

        * Objects can now send mail as themselves, not their players.
          Mail from objects is reported as being from an object
          when read. The format for @mail(/read) has changed somewhat.
        * page[/list] now stores the last player(s) you paged in a LASTPAGED
          attribute, so you can re-multipage. The behavior is a little
          different for page and page/list. Page stores exactly what
          you typed as the last player/list of players to page; page/list
          stores only those names for whom the page succeeded.

Fixes:

        * The site of last failed login used to be a visual attribute.
        * Parser misbehaved on: think ( foo ), removing spaces. [TAP]
        * @edit and related wasn't stripping leading spaces from the
          right side of the = sign. Fixed.
        * Problem with count of unread mail on login with EXTENDED_MAIL
          fixed.
        * @channel/rename can now rename a channel to the same name
          with case changes, without an error.
        * +channel now matches partial ambiguous channels in a smarter
          fashion - it looks for a channel you're on.
        * Better help for @clock
        * die(0,x) now returns 0. die(negative #,x) returns an error. [TAP]
        * @chan/decompile can be used by the channel's owner or
          anyone who passes the modlock, as well as Wizards.
        * Channel hide locks work right. [RLM]
        * @chan/decompile now shows the correct commands for locking
          channels. [RLM]

& 1.6.2p1
Version 1.6.2 patchlevel 1              January 28, 1996

Fixes:
        * get_eval error about # of args fixed.


& 1.6.2p0
Version 1.6.2 patchlevel 0              January 26, 1996

New Commands:

        * @mortal <command> lets a privileged player run a command
          as if they were unprivileged. [TAP]
        * ahelp/anews shows admin help/news topics to admin players. 
          Admin-only topics are in the same files (help.txt/news.txt),
          but topic names begin with '&'. For example:
          & for-all-players
          ...text...
          & &admin-only
          ...text...
        * page/list <players>=<message> will do a multipage with a less
          spammy format for the pager.

New Functions:

        * mortal() lets a privileged player evaluate as if there were
          unprivileged. [TAP]

New Flags:

        * MORTAL, to support @mortal and mortal(). Used internally, and
          not settable. Can be reset by Wizards, just in case, though. [TAP]

Minor Changes:

        * If you have a channel "admin" and a global +admin (no args),
          calling +admin will run the global, not give the
          "What do you want to say to that channel" message, under
          extended chat.
        * If a panic db is corrupt, the restart script will move it to
          save/PANICDB.corrupt instead of removing it.

Fixes:
        * Problems with compile when HAS_SIGACTION is undefined.
          Noted by Brian Favela, affects Linux.
        * Duplicate uselock check in atr_comm_match removed.
          Noted by Brian Favela.
        * Looking at an exit showed the full name and aliases, not just
          the full name. [TAP]
        * Compiling without EXTENDED_MAIL works right.
        * Potential buffer overflow problems in look_exits() fixed.
        * get_eval() really uses a /, not a comma, like the help says.
        * (Hopefully) last remnants of old parser removed from externs.h
        * @dol on an empty list now doesn't give the weird "what do you want
          to do with the list" message. @dol with an empty command does. [RLM]

& 1.6.1p1
Version 1.6.1 patchlevel 1              January 23, 1996

Fixes:
        * v(#), v(!),and v(N) now return the same thing as %#, %!, and %N.
          [RLM]

& 1.6.1p0
Version 1.6.1 patchlevel 0              January 21, 1996

New compile-time options:

        * SAFER_UFUN: when defined, prevents less priv'd objects from
          evaluating ufuns on more priv'd objects, which helps a
          potential security problem with side-effect functions.
          This is more of a stopgap -- control and security will be
          revamped in a future release -- but is recommended.

New .cnf directives:

        * player_creation enables/disables "create" at login screen.
          Also @enable/disable creation
        * use_dns enables/disables IP-to-hostname resolution

New Functions:

        * tel(thing,destination)
        * oemit([room/]object,messsage)
        * emit(message)
        * lemit(message)
        * remit(object, message)
        * zemit(zone, message)
        * timestring(secs,flag) converts seconds to #d #h #m #s
          format. If flag is 1, the string always includes all time
          periods (e.g. timestring(301,1) = 0d 0h 5m 1s). If flag is
          0 or omitted, only the necessary periods are included
          (e.g. timestring(301,0) = 5m 1s). 
        * left(string, n) returns the first n characters of the string
        * right(string, n) returns the last n characters of the string
        * hasflag() syntax extended to hasflag(obj[/attr],flag) for
          checking attribute flags as well.
        * functions() lists all enabled functions
        * atrlock(obj/attr[,<on|off>])
        * doing(player) returns a player's @doing if they can be see
          on the WHO list

Minor Changes:

        * @allquota now has /quiet switch, and works correctly when
          no limit is given. [NJG]
        * The restart script is now a lot smarter, and figures things
          out from mush.cnf. All that needs to be set is the location
          of the game directory, and if you use make customize, not
          even that.
        * @wall/@rwall/@wizwall with a null message fails. (src/speech.c)
        * SIGHUPs sent to the MUSH are now logged in netmush.log
        * Common code called when object ownership is changed has
          been encapsulated into a single function for modularity.
        * crypt() is now a macro on systems which can't define HAS_CRYPT

Fixes:  
        * The table() function was incorrectly truncating some
          list elements. Fixed. Report by Alaric@WoP
        * The match() function was returning an empty string instead
          of 0 when it failed to match. Fixed. Report by Alaric@WoP.
        * help math functions now list the transcendental and other
          floating point functions
        * map() and mix() were broken. Fixed. [TAP] (src/funlist.c)
        * @grep/print is now case-sensitive, like help says. (src/predicat.c)
        * Refunding money when objects are chowned 
          was refunding 10 coins, instead of the object deposit. [RLM]
        * convtime() hadn't been converted to the new parser,
          and therefore was broken. Fixed. (src/funtime.c)
        * Compilation warning in src/game.c fixed
        * Giving players large negative amounts of money was slightly
          broken and is now fixed. Obscure, eh? [RLM] (src/rob.c)
        * Misleading comment in options.h.dist about QUEUE_LOSS
          fixed. [RLM]
        * Help fixed to indicate that there's no longer a 10 dimension
          limit on vector functions.
        * Various missing prototypes corrected.
        * make customize now correctly sets the restart script
          executable, and installs links to netmud and mkindx.
        * Improved Win32 portability [NJG]
        * Fixes to default() and edefault() [TAP]

& 1.6.0p5
Version 1.6.0 patchlevel 5              January 17, 1996

Fixes: 
        * Extended chat: @chan/decomp shows privs correctly now
        * Extended chat: When a player is destroyed, channels they own
          are chowned to God.

& 1.6.0p4
Version 1.6.0 patchlevel 4              January 17, 1996

Fixes:
        * Extended chat: Formerly, non-players could create channels.
          No longer.
        * Extended chat: Channel creation cost is now refunded when
          channel is removed.
        * Help text for HALT (game/txt/pennflag.hlp) and SUBSTITUTIONS
          (game/txt/penn.hlp) now notes that HALTed objects do not
          evaluate functions or substitutions.
        * Nick Gammon's new email address is in README and win32/README


& 1.6.0p3
Version 1.6.0 patchlevel 3              January 16, 1996

Fixes:
        * default, edefault, udefault now work like Tiny 2.2, not eval'ing
          their arguments.
        * Many fixes to the extended chat system.
        * Fixed misspelling of Guest in @config.
        * @function on a non-existant object no longer crashes. [TAP]
        * Problems with paranoid dumps not setting the correct dbflags
          corrected. [TAP]
        * Problems with EXTENDED_MAIL crashing when using LOGOUT fixed. [RLM]
        * @warnings for exit-msgs and thing-msgs warned when there was
          no OFAIL on a locked exit/thing, which is silly. [1.6.0p1]
        * Started patching the CHANGES file, like I should.
        * Fixes customize.pl
        * Fixes update-cnf.pl so that 'make update' won't trash player_flags
          (and other repeatable directives) in mush.cnf
        * Fixes game/txt/README

& 1.6.0p0
Version 1.6.0 patchlevel 0              January 10, 1996

Major Changes:

        * New function parser with improved speed, sanity. [TAP]
        * Complete rewrite of destruction code. Undestroying supported
          for all objects, @adestroy works sanely, SAFE is safer,
          better consistency checking. [RLM]
        * Support for 'plural' gender for TinyMUSH compatibility. [2.2]
        * Most filenames are now 8.3, to support the win32 port
        * Some options have been moved to the runtime config file
          (dbcomp). Others have been removed entirely.
        * 'make update' will update runtime config directives
        * The chat system has been completely rewritten. Number of 
          channels is limited only by memory, channels are saved
          across shutdowns (modifying source to add channels never
          required), channels can be locked in various ways, 
          non-wizards can create channels, etc.
        * New .cnf directives: chat_database (where to store channels),
          max_player_chans (how many channels can a non-admin create),
          chan_cost (how much does creating a channel cost)
        * The CSRI malloc is now supported and suggested. In addition
          to being extremely memory-efficient, it offers leak detection
          and profiling features.
        * The database format now defaults to quoting text, which is
          less vulnerable to corruption, in particular the loading of
          attribute locks starting with a number. [1.50-15-04,05 TAP]

New Functions:

        * matchall() [2.2]
        * default(), edefault(), udefault() [2.2]
        * aposs() and %a return absolute possessive pronouns [2.2]
        * elements() [2.2]
        * mudname(), version(), starttime() [2.2]
        * stats() is now an alias for lstats() [2.2]
        * ulocal() [2.2]
        * search() is now an alias for lsearch() [2.2]
        * folderstats() returns information about numbers of messages
          in a given @mail folder
        * last() is the counterpart to first(), and returns the last
          item in a list
        * mailtime(), mailstatus(). Suggested by Alaric@WorldOfPain.

New Commands:

        * @emit can be abbreviated '\\', for TinyMUSH compatibility
        * The speech commands (say, pose, @[po]emit, whisper, page)
          can now take a /noeval switch, which prevents them from
          evaluating the message.
        * 'semipose' is an alias for pose/nospace
        * 'INFO' from the connection screen gives version info for
          the MUSH, for use by automated mudlists and the like.
        * @sitelock/name adds names to the banned names file.
        * @enable/@disable guests (and new cnf file directive guest_allow)
        * @decomp now takes /flags and /attribs switches to only decompile
          the creation/flags information or the attribute information.
        * @list command partially implemented for TinyMUSH compatibility.

New Flags:

        * CLOUDY flag on exits provides partial transparency. A CLOUDY
          TRANSPARENT exit shows only the description of the room beyond, 
          no contents.  A CLOUDY but not TRANSPARENT exit shows only 
          the contents, no desc.
        * FORCE_WHITE flag on an ANSI player forces their output to be
          reset to white, necessary for some poor ansi terminals which
          "bleed". [Kalkin]

Minor Changes:

        * @chzone'ing an object to 'none' no longer clears its privbits.
        * OXMOVE attribute is shown to the room you're leaving.
        * Setting and resetting the SUSPECT flag is now logged in wizard.log
        * Various outdated defines have been removed from options.h/dune.h
        * Objects can now use @mail commands, as if they were their owners.

Fixes:

        * idlesecs() now accepts "me".
        * "pose" (not ":") used to discard everything after an "=".
        * The "entries" entries in help.txt, etc, have been fixed a bit.
        * index(a| |b,|,2,1) now returns a null string instead of "|b"
        * Various memory leaks [1.50-15-01]
        * When fork fails, a non-forking dump is done, and the MUSH
          no longer exits. [1.50-15-02]
        * Soundex() no longer hangs on non-alphabetical. [1.50-15-06]
        * dist2d and dist3d are safer on non-IEEE math systems. [1.50-15-03]
        * mail() now counts messages across all folders
        * Better matching of del_check to add_check [1.50-15-11]
        * PennMUSH now compiles correctly without EXTENDED_MAIL
          [1.50-15-10]
        * Some fixes to unparse.c to stabilize huffman compression
          [1.50-15-09,RLM]
        * Fixes to @boot [1.50-15-08,TAP]
        * Fixes to variable exit handling by quick-unparse [1.50-15-07,AKM]
        * Configure now tries to find a full path for uptime(1) so that
          @uptime will work
        * Fixes to forbidden_site and forbidden_name when there's no
          sites/lockout/names file. [NJG]
        * Backspace handling for really dumb terminals improved [NJG]
        * When changing the text of an attribute, its flags are no longer
          reset. [RLM]
        * When seizing a link, coins weren't refunded if the seize failed.

& 1.50p14
Version 1.50 patchlevel 14              July 3, 1995

This patchlevel is primarily concerned with bugfixes and patch management.

Maintainer changes:
  * New file 'Patchlevel' tracks mandatory patches to insure that they 
    are applied in the proper order
  * Clearer 'restart' script. [TAP]
  * The indexing script for help/news/etc now creates the topic 'Entries'
    instead of 'Index', to prevent a conflict with 'help index()'.
  * The file hdrs/db.h is now hdrs/mushdb.h, to match Tiny 2.2 and
    because FreeBSD complains about db.h.
  * The links hdrs/dune.h and hdrs/options.h were unnecessary and
    are now removed.
  * The noforking dump messages have been moved to mush.conf

Commands:
  * The @set obj1=attrib1:_obj2/attrib2 form no longer works, as
    it conflicts with general attempts to set attributes that start
    with underscores. Use @cpattr for copying attributes.

Options:
  * EXITS_CONNECT_ROOMS, if defined, prevents rooms with at least one
    exit from being announced to players as "disconnected rooms".
  * RALPH_DEBUG option allows for improved DEBUG flag output. [RLM]
  * When MEM_CHECK is defined, it dumps mem_check info to the
    checkpt.log before each dump.
  * SAFER_PLAYER_NAMES options has been removed. Player names can't
    contain those funny characters, period.

Fixes:
  * Added -D_INCLUDE_AES_SOURCE to hpux hints
  * stdlib.h is now included in eval.c to get atof. This was breaking
    linux MUSHes badly.
  * Linux hints now use BSD signal semantics.
  * Various attempts to fix possibly unusual bugs in compression.
  * The internal TRANSPARENT flag bit macro is now TRANSPARENTED,
    because Solaris defines TRANSPARENT
  * A bug causing setq'd registers to be incorrectly munged has been fixed.
  * @chzone warning messages refer to zone-lock, not elock, if RALPH_LOCKS
    are compiled in.
  * Examining a player who was on a null channel was reported to crash
    one MUSH. Some attempts have been made to fix that problem.
  * The compose.csh script in game/txt has been replaced by 
    compose.sh, which now deals properly with systems which are missing
    perl (gasp!)
  * Configure script hopefully won't die when checking signals on Linux.
  * Fixes to some strange @mail behavior. [RLM]
  * CType in compress_h.c is now unsigned long, not long. [RLM]
  * Fix to converting old maildbs to mail subjects [RLM]
  * Bigram compression could (rarely) cause $commands or ^patterns
    to stop functioning.
  * GoodObject() used to consider db_top to be a valid dbref. It's not.
  * Recycling of objects was broken in pl13 and is now fixed. [RLM]
  * mush.conf can now deal with the FIXED flag as a default flag [RLM]
  * A lot of mem_checks weren't being deleted, especially exec.buff ones.
  * Defining COMPRESSION_TYPE to be 0 (no compression) now works. [TAP]
  * Paranoid dumps no longer stomp out tabs and newlines unnecessarily.
  * Configure now checks for IEEE math compliance, and defines HAS_IEEE_MATH
    which is used by the code to determine if some math functions need
    to be limited.
  * SOLARIS defines have been removed as extraneous.

& 1.50p13
Version 1.50 patchlevel 13              June 1, 1995

Patchlevel 13 was very much a collaborative effort with Ralph Melton
and T. Alexander Popiel, terrific MUSHhacks.

Major user changes:

  * Complete rewrite of locks, which allows for many, many new
    locks, including user-defined locks, with reduced memory usage. [RLM]
  * @mail can now have a subject.

Major maintainer changes:
  * The code now contains ANSI prototypes (if Configure ascertains that
    your compiler likes 'em) for easier debugging.
  * The help, news, and events entries are now managed in subdirectories
    of game/txt/, and automatically indexed.
  * The names.conf file now accepts wildcards
  * New Makefile target 'update' will propagate your options.h/dune.h
    settings into an options.h.dist/dune.h.dist template, ask you
    whether you want to define any newly-introduced options, ask
    you if you want to remove any obsoleted options, and write out
    new options.h/dune.h files.
  * Improvements to the autoconfiguration scripts, which now generate
    a config.h and confmagic.h file in the top-level directory. These
    headers tell the code what kinds of features are available.
    Accordingly, the old hdrs/config.h header file has been renamed 
    hdrs/conf.h
  * The 'whisper_loudness' config directive in mush.conf sets the
    probability that a noisy whisper will be noticed in the room. 
  * If the standard Huffman attribute compression gives you trouble, you
    can use the COMPRESSION_TYPE define to use the older bigram
    compression system, now auto-tuning, or no compression at all.
  * The TINY22_BOOLEANS option causes the MUSH's boolean functions
    (and(), or(), not()) to be compatible with TinyMUSH 2.2. In Tiny 2.2,
    only non-zero integers are "true". In PennMUSH's default, non-zero
    integers, non-negative db#'s, and strings are "true". You pick.
  * NO_NUKE_SAFE_PLAYER prevents @nuke from working (for Wizards) on
    players set SAFE. You have to unSAFE them first.

New functions:

  * MWHO() function is like LWHO() but always evaluates as if the
    enactor were an unprivileged player. Useful for globals.
  * ISDAYLIGHT() returns 1 if it's daylight savings time, 0 if not.
    By Dave Sisson
  * CWHO() now returns a list of dbrefs, NOT NAMES. Much more flexible.
  * ITER() now can take a fourth argument, which is the output delimiter.
    You can have any string shoved between the output elements instead 
    of a space (for example, a %r).
  * TABLE() for presenting lists in rows.

New commands:

  * Players can connect with 'ch name password', which is just like
    'cd', but connects hidden. Activated by defining DARK_CONNECT
  * @warnings now allows players to exclude warnings by using
    @warnings me=!warning. [RLM]
  * @ps/quick now displays only the summary line of @ps for players.
  * @decomp can take a /tf switch, which makes its output emulate
    the 'FugueEdit' object (originally by van@TinyTIM) which
    lets you use tf to edit attributes. Idea by Lord Argon.

Minor changes:

  * The 'news code' and 'news changes' entries are now in help.txt,
    so you don't need to update your MUSH's news.txt files when you upgrade.
  * In an ambiguous situation (i.e., @dest foo when you carry
    foobar and foofoo), @dest will no longer pick one at random. It'll fail.
  * #0 is now evaluated as TRUE in the context of boolean functions,
    because it's a valid dbref (applies only #ifndef TINY22_BOOLEANS)
  * haspower() allows players to see powers on things they control,
    even with HASPOWER_RESTRICTED defined. [RLM]
  * O-attributes which evaluate to nothing are no longer displayed. [AKM]
  * Paranoid dumps no longer smash \r and \n.
  * @mvattr no longer deletes the original attribute if the copies fail.
  * Secure now stomps out ^'s
  * The getrandom() function has been rewritten. [RLM]
  * It's now a lot harder to have Guest and Wiz/Roy set on the same
    player. Players shouldn't be able to connect to Wiz/Roy Guests anymore.
  * HARSH_GUEST is now a lot harsher. Guests pretty much can't modify
    the database except to lock/unlock things they control.
  * players who are on a priv'd channel may speak/leave
    even after they lose their privs. [RLM]
  * Xenix options removed from options.h.dist, since the Xenix code
    isn't supported anymore anyway.
  * The size of MAX_COMMAND_LEN (and therefore all derived buffers)
    has been doubled.
  * Doing a 'make' from the src/ directory will now call the top-level
    makefile. This helps those who use emacs (like Ralph, who came up
    with this) and M-x compile from the srcdir.
  * @version shows compilation flags.
  * Admin WHO no longer wraps lines. Sitenames are truncated as needed. [TAP]

Fixes

  * Repaging a player with a multi-word name works correctly now.
  * Players with the tport_anything power can teleport FIXED things. 
  * @map works as documented again.
  * Paranoid @dumps don't give so many spurious bad attribute warnings.
  * ZMO elock checking now uses PLAYER_START and MASTER_ROOM instead
    of #0 and #2. [RLM]
  * @pemit/list now replaces ## with the target's db#, as the help says.
  * Subtle bug in exit matching fixed. [RLM]
  * escape() and secure() no longer parse their arguments.
  * The asterisk-line separators on the nologin messages have been
    prettified slightly, at Tigger's suggestion
  * Some systems didn't deal well with overflowing @doing and @poll's.
    Dave Sisson patched it.
  * Error in bsd.c when compiling with DARK_CONNECT but without ROYALTY
    fixed. (Reported by Suud@Gohs)
  * hasflag, andflags, and orflags patched to prevent mortals from
    using them to see mdark flags [RLM]
  * Type mismatch in warnings.c fixed [RLM]
  * fun_lcstr() and fun_ucstr() have been changed slightly in order to
    support unices like MachTen which appear to define tolower() as 
    a macro meaning (isupper(x) ? _tolower(x) : (x)), and were getting
    hosed by the tolower(*ap++) call. Bug reported by Adrick.
  * It was possible to overflow the buffers in do_log by having a 
    Wizard do @fo me=think lnum(5000), for example. No longer, I hope.
    Bug report and suggested fix by Adrick.
  * Removed an old bit of code that broke compiles using original mailer
  * The restart script is a little smarter about preserving databases.
  * Fixed a bug that caused ALWAYS_PARANOID to dump core.

& 1.50p12
Version 1.50 patchlevel 12              March 23, 1995

Major changes:

  * The matching routines in match.c have been rewritten to be
    reentrant, which fixes some subtle but important bugs
  * New Makefile target 'customize' for setting up customized
    per-mush subdirectories for those who run multiple mushes.
  * An untested DELETE_POWERS define in options.h, which will remove
    powers from a database, to make it easier to switch to TinyMUSH

New flags/powers:

  * Things with the Pemit_All power can @pemit to HAVEN/ulocked players.
    Useful for globals.

--- Fixes ---
  
  * Previously, passing the elock of a ZoneMaster player allowed 
    control over *all* the ZM's objects, including the ZM player itself.
    Players are no longer controllable this way.
  * Incorporated patch for compiling without CREATION_TIMES defined
  * Incorporated Ralph Melton's patch to warnings.c to fix core dump
    with multiple exits warning.
  * Nobody can @tel rooms any more. New code for @tel'ing exits has
    been written, however, and players may now @tel exits they control
    from rooms they control to rooms they control.
  * Z_TEL bug: players could defeat Z_TEL by entering an object and
    @tel'ing from there. Reported by Ralph Melton.
  * Bug in puppet checks in @teleport fixed.
  * Players in exactly 15 levels of container could defeat NO_TEL. Fixed.


& 1.50p11
Version 1.50 patchlevel 11              March 5, 1995

At Amberyl's suggestion, the "dune" numbering scheme has been 
abandoned. This is 1.50 pl11, and future versions will be numbered
accordingly.

Major changes:

  * All objects can now have creation dates. Non-player objects have
    attribute modification dates as well. Players have number of login
    failures since last logins tracked instead. Supported by
    ctime() and mtime() functions to return creation/modification time.
    (CREATION_TIMES define in dune.h)
  * The extended @mail system now maintains the maildb sorted by
    recipient, and each player descriptor has a pointer to where that
    player's mail begins in the maildb. This is much faster for reading 
    and listing and clearing mail, only slightly slower when sending.

New Commands:

  * @boot/me: boots a player's idle descriptor (to selfboot hung 
    connections).
  * whisper has two switches: silent and noisy. Standard PennMUSH whisper
    is silent, and is the default unless NOISY_WHISPER is defined.
  * @grep can take two new switches, /ilist and /iprint, which are just
    like /list and /print, but case-insensitive.

New Flags:

  * LIGHT (as in TinyMUSH): LIGHT objects/players appear in DARK rooms.
    In addition, LIGHT exits also show up.
  * Z_TEL: When set on a Zone Master Room or a room in a zone, prevents
    players from using @tel from that room to any room that's not in the
    same zone. Useful for puzzle areas or enforcing some IC constraints.

New Functions:

  * The lsearch() command can take a range of db#'s
  * ctime() and mtime() functions (if CREATION_TIMES is defined)
  * grepi() is a case-insensitive grep
  * hasattr() returns 1 if an object has a given attribute
  * hasattrp() returns 1 if an object or its parent has a given attribute

Minor Changes:

  * @away/@haven/@idle messages are not sent if they're null
  * Players always receive feedback when they use @hide
  * Players who are FIXED are now permitted to @tel objects into their
    inventory. This makes coding puppets which follow you much easier.

--- Fixes ---

  * examine/mortal now functions more like it should. 
  * If a ZMO was elocked to an object in #2, players couldn't @chzone
    things to it. Reported by Melkor@Beleriand. Fixed.
  * WHO is grammatical when reporting # of connected players. Idea
    from Kalkin.
  * The Connected ('c') flag is no longer visible to mortals.


& 1.50pdune2
Version 1.50 patchlevel dune2              March 5, 1995

DuneSource pl2 changes

Major changes:

  * Extensive warning system for things missing on objects, rooms, etc.
    @warnings command for players to set the level of warnings they want,
    @wcheck[/all] command for players to check an object (checks can also run
    at a God-configurable interval on the whole db), NOWARN flag for objects
    and players. Idea from Kalkin's adaptation of MUSE code, totally
    rewritten.
    

New options (dune.h):

  * GUEST_TEXTFILE option enables a textfile (guest.txt by default)
    to be shown to Guests who log in. Idea and source code from Kalkin.
  * PAGELOCK_NOT_USELOCK option causes @lock/use to fail for players,
    requiring them to type @lock/page. The lock itself has not changed,
    just the interface, to remind players of its function. By Ralph Melton.
  * More control over possessive gets with the POSSESSIVE_GET define
    and the POSSGET_ON_DISCONNECTED define. Possessive get can be
    disabled, enabled for all but disconnected players, or enabled
    at all times (the default PennMUSH behavior)

New functions:

  * lit() returns its input totally unparsed, and without spaces compressed.
  * t() returns the truthvalue of its input, guarranteed to be either
    1 or 0.
  * objmem() and playermem() functions, return the memory usage of
    an object or all of a player's objects. Requires search_all power.
  * grab(list,pattern[,delimiter]), returns the first element of list
    which patches the pattern. Patterns are of the match() type.
    From the TinyMUSH 2.2 code.

Minor Changes:

  * You must actually own an object (not just control it) or be a
    Wizard in order to set it chown_ok or dest_ok. By Ralph Melton.
  * You can use #$ in the actions in a switch() function
    or @switch/@select statement, and it will be replaced by the switch
    expression before executing or evaluating. This can improve
    efficiency and save space. For example:
        switch(complexfunc(%0),Bob,BobResult,#$)
    is equivalent to:
        switch(complexfunc(%0),Bob,BobResult,complexfunc(%0))
    but only requires a single evaluation of complexfunc(%0).
    Suggested by Kenric@DuneII.
  * "things" is a synonym for "objects" in @search now. By Ralph Melton

--- Fixes ---

  * #-2 is treated as a "0" (false, like #-1) in functions which need a
    logical value for it. Previously, it was treated as -2 (true).
  * @select is now considerably more efficient - it no longer will 
    evaluate anything after the matched action. The old behavior
    could well be a bug in the right conditions as well. 
  * atr_add now rejects null attribute names, so you probably can't set them
    any more. Suggested by Kalkin, the code's by Mike@StarWars.
  * Players can reset a DARK flag on themselves, but still can not
    set themselves DARK.
  * andflags(me,!Dc) used to return 1 if I am !dark and !connected,
    instead of !D and connected, as the help states. Fix by Ralph
    Melton.
  * Halting an object which is @wait'ing used to fail to decrement
    the owner's queue attrib. Fixed now. Patch by Ralph Melton.
  * set_flag uses strupper instead of upcasestr now, which should fix
    a bug on some systems wherein "cd" command would crash the MUSH and
    a similar bug wherein players connecting would crash the MUSH if
    the ON-VACATION flag was in use.
  * The old channel syntax (@channel foo=command) works again.
  * The RULES option now works.
  * The convtime() has been rewritten to work on NeXT's correctly.
    Previously, its malloc failed and it returned -1.
  * Systems which have getrlimit, but *don't* have RLIMIT_NOFILE,
    are now supported. Notably, Aix 2.x and 3.x.
  * The installation hints for Solaris 2 have been improved.
    WAIT_TYPE is defined as int, and if NBPC can't be found for
    getpagesize(), it'll try PAGESIZE instead. Thanks to Kalkin for these.
  * Installation for AIX has been improved. AIX required inclusion of
    sys/select.h in the IDENT stuff.
  * Various rewrites of tests against NOTHING to use the GoodObject()
    macro instead. Thanks to Ralph Melton for some of these.
  * Got rid of some warnings when compiling mkindx

 
& 1.50pdune1
Version 1.50 patchlevel dune1              March 5, 1995

DuneSource pl1 changes

Major changes:

  * Whem players attempt to log in to a Guest character that is already
    in use, the server tries to find one that isn't, and connects the
    player to that. If it can't, you get the old behavior (two connections
    to the single Guest).
  * Extended @mail system is available with many new mail commands.
  * Dump warnings 5 minutes and 1 minute before non-forking
    dump, and optional announcement at completion of dump.
  * Guest players may not set attributes.
  * Kill command can be disabled.
  * @aconnect/@adisconnect messages on individual rooms.

Changes to commands:

  * CD command at connection screen allows Wizards to connect to the game
    DARKly.
  * @sitelock command for on-the-fly sitelocking by Wizards.
  * @dump/paranoid can try to fix the db in memory, too.
  * @decomp/db, produces decomp output using dbref of object instead
    of its name.
  * ex/mortal, shows examine output as if player were mortal.
  * Option to rename @destroy to @recycle, since @dest and @desc are
    easy to confuse.
  * @restart command. Combines an @halt with triggering @startup.
  * @hide now provides feedback when used.
  * @find may be restricted to royalty, the only ones for whom it might
    possibly be useful.
  * @function now lets you know when it updates an @function.
  * The old (pl8?) @channel <channel>=<function> syntax is back, along
    with @channel/<function> <channel>, for those who liked it.
  * @grep can be either case-sensitive or not (the default).
  * If you don't specify the destination attribute in @cpattr, it
    assumes you want the same attrib name as the source attrib.
  * @mvattr, like @cpattr, but removes old attribute.
  * ANSI players now see their @edit additions in bold.
  * Rooms and exits can @emit. Rooms @emit into themselves (like @remit),
    and exits @emit to their source room.
  * @squota can now be given quota levels as +<quota> or -<quota>, to
    increase or decrease a player's quota from its current level.

Changes to functions:

  * encrypt() and decrypt() functions.
  * hidden() function for checking if a player is hidden.
  * hastype() function for checking if a thing is a given type.
  * pemit() function sends pemits to a list of objects.
  * lparent() function, returns object's parent, grandparent, etc.
  * quota() function, returns a player's quota.
  * N-dimensional vector arithmetic functions: vadd(), vmul(), vsub(),
    vmag(), vdim(), vunit()
  * haspower() can be restricted to admin.
  * "Lower math" functions: shr(), shl(), inc(), dec()
  * beep() with no arguments produces a single beep.
  * pmatch() will now accept *player or #dbref arguments.
  * lsearchr() function does an lsearch *backwards* through the db.

Changes to flags/powers:

  * Flags can be defined as dark (invisible to all but God), 
    mdark (invisible to mortals), and odark (invisible to mortals who don't
    own the object) in flags.c.
  * @cemit can be granted as a power
  * The ability to set/unset the DEBUG flag on objects the player controls
    can be granted as the Can_Debug power. (Idea by Kenric@DuneII)
  * Optional COLOR flag to control reception of ANSI color apart from
    ANSI hiliting.
  * OPAQUE flag on exits. OPAQUE exits in translucent rooms look
    like normal exits in non-translucent rooms.
  * FIXED flag prevents @tel and home.
  * DARK Wizards need not trigger @aenter.
  * The SUSPECT flag is now abbreviated 's'.
  * NO_LEAVE flag on objects prevents 'leave' command from working in them.
    Useful for flying vehicles and the like.

Minor changes:

  * &adestroy attribute triggered when object is dest'd.
  * Player/room/object names can appear automatically in bold.
  * Dark and Hidden players are distinguished on the admin WHO list
  * Dark and Hidden players are indicated on the admin DOING list
  * Wizards who idle are set hidden, not DARK. Same for royalty.
  * DARK wizards enter and leave @chat channels silently.
  * Royalty can now see the Wizard @channel/list
  * The mortal @channel/list lists only public channels.
  * @idle/@haven/@away attribs which evaluate to nothing are not
    sent to the paging player.

--- Fixes ---

  * TRANSPARENT variable exits don't crash the MUSH when looked at.
  * @channel/delete and @channel/privs take the right number of arguments
  * @decomp now decompiles flags properly.
  * When logins are disabled, players may not create characters.
  * The controls() function is made safer. Defining SAFER_CONTROL prevents
    anyone but God from controlling God, any non-wizard from controlling
    anything with a wizbit, and any non-admin from controlling anything with
    a roybit.
  * Player names are made safer. Defining SAFER_PLAYER_NAMES prevents the
    use of [, ], %, and \ in player names.
  * The strupper() function is made safer.
  * Mortals can remove the DEBUG flag on objects they own.
  * The set functions now take delimiters like they should.
  * Revwords() takes a delimeter, like it should.
  * @config displays whether function side effects are available correctly.
    It used to get it backwards.
  * Some checks against NOTHING have been changed to use the GoodObject()
    macro in look.c and possibly other places.
  * It's more difficult for players to enter themselves.
  * PLAYER_NAME_SPACES works right now, use double-quotes around 
    multi-word names.
  * haspower() on unknown powers now returns #-1 NO SUCH POWER instead
    of a null string.

& 1.50p10
Version 1.50 patchlevel 10              March 5, 1995

Patchlevel 10 Changes

New additions:
  - Guest is now a power. Set it on a player to restrict its command set. 
  - New power Announce, which controls the ability to @wall. 
  - Global r-registers are now preserved across the queue. 
  - '#@' now replaces to the list-place for iter() and @dolist. 
  - Timers now operate on absolute time, rather than game ticks. 
  - Checks of $commands now obey parent uselocks. 
  - Variable exit destinations.  When you attempt to go through one of these
      exits, it evaluates the exit's DESTINATION attribute as a
      U-function, and uses the result accordingly. 
  - Rooms can now be set LISTENER. The flag name has been changed to MONITOR
      (which is what it's called in 2.0), with LISTENER as an alias.
      (Thus the MONITOR flag on things/rooms and on players mean
      different things.) 
  - If the EXTENDED_ANSI option is turned on, it enables the ansi() function,
      allowing ANSI control codes to be used.  
  - New wizard command @log can write information to a log file.  
  - @oemit now takes its target location from the person to exclude, not
      the person who is doing the @oemit (consistent with 2.0 behavior,
      and more flexible).  
  - @ps now follows the 2.0 syntax. Items deleted from the queue are now
    counted, and the entire thing calls a single generic routine.

Function changes:
  - More functions take delimiters. The newly-modified ones are:
      extract(), filter(), first() fold(), iter(), match(), member(), munge(),
      rest(), revwords(), setdiff(), setinter(), setunion(), shuffle(), 
      sort(), splice(), wordpos(), words()
  - If function side effects are configured as enabled, the functions link(),
      set(), parent(), lock(), clone() and name() can make db changes.
  - controls() has been tweaked so it returns '#-1 <error message>' on invalid
      objects, for consistency with other functions and with 2.0.
  - delete() is now ldelete(). The new delete() function deletes characters
      from a string. This is a change to be consistent with 2.0.
  - lcon() is now consistent with the 2.0 convention -- no more partial lists;
      either you can get the entire list, or you can't get it at all.
  - locate() has some new parameters: 'c' matches 'carried exits', supported
      by match_carried_exit(). Exit matching now calls match_exit_internal().
      'X' allows random choice if the result is ambiguous (#-2).
  - lsearch() now takes an EVAL class.
  - objeval() evaluates its first argument.
  - owner() now can take an object/attribute pair.
  - sort() autodetects for floating point, and uses qsort.
  - User-defined functions, such as U(), now return an empty string, rather
     than #-1 SOME ERROR MESSAGE, because 2.0 behavior is to return an empty
     string, and, generally, the empty string is easier to handle.

New functions:
  - New substitution: %qN is equivalent to r(N)  (also twiddled v() slightly)
  - Findable(). Can <a> locate <b>? Useful for those WHO-list-type globals.
  - Foreach(). Works basically like MAP(), but on strings.
  - Haspower(). Like hasflag(), but for powers.
  - Ports(). Returns the network descriptors a player is connected to.
  - Rloc(). Returns an object's location at a variable level.
  - Sortby(). Sorts a list by an arbitrary u-function.
  - Stripansi(). Strips the ANSI codes from a string.

Important other changes:
  - Fixed a bug in the checking of ZMO locks in the game's internal controls().
      The privs parameter to eval_eboolexp() needs to be the ZMO in question,
      rather than the object itself, in order for attribute locks to work as
      would seem logical (the object being checked shouldn't even factor into
      the equation, since by definition zone control is based solely upon
      the ZMO's enter lock).
  - Because people seem to want it back, the "pose" command is back, together
      with a /nospace switch.
  - TRACE is now an alias for the DEBUG flag.
  - Player lookups on dbrefs work (i.e, '*#1' is now valid).
 
& 1.50p9
Version 1.50 patchlevel 9

Patchlevel 9 Changes

New additions:
  - @cemit command emits to a channel.
  - "Quiet" channels added. They don't show connect/disconnect or joined/left.
  - '%c' returns the current command.
  - @dolist/notify queues a '@notify me' after queueing the list commands.
  - @pemit/list pemits to a list of dbrefs. No more @dolist/@pemits needed!

New functions:
  - Center(): centers text on a field.
  - Cwho(): returns the names of players on a channel.
  - Isdbref(): checks if something's a valid dbref.
  - Map(): like iter() over a user-defined function.
  - Mix(): like map(), but takes two lists.
  - Munge(): combines lists, allowing you to do things like conversion sorts.
  - Objeval(): evaluates an expression from another object's viewpoint.
  - Trim(): trims characters at the beginning and/or end of strings.
 
Other changes:
  - Add(), And(), Mul(), and Or() can take up to 100 arguments.
  - Channel commands are now switch-form.
  - Debug-flag output is neater and more useful.
  - Default input line length is 2K.
  - @grep output format is neater and shorters. 
  - @link can link already-linked exits.
  - Locate() can take an 'l' parameter to check object location.
  - Output line termination is now carriage-return-newline.
  - Starting quota is now a conf option.
  - @wipe can take an object-attribute pattern.
 
Important bugfixes and modifications:
  - Controls() now obeys the inherit flag.
  - Enactor (%#) in idesc evaluates to the player, not to the object.
  - The escape character is stripped by the parser.
  - Listening objects trigger enter/leave messages in DARK rooms.
  - Matching is only done on exits if there is no exact match after trying
    all other possibilities.
  - Non-INHERIT things can no longer @parent things which are INHERIT.
  - Delete(foo%b,1) and Delete(foo,1) now return the same result.
  - Replace(foo%b,1,Test) and Replace(foo,1,Test) now return the same result.
  - Taking from an object is now governed by control, as well as ENTER_OK.

& 1.50p8
Version 1.50 patchlevel 8
 
Patchlevel 8 Changes
 
Major new features:
  - Players can now set an @alias.
 
New additions:
  - Player ZONE flag and ZoneMaster control provide "safer" zones.
  - @hide command hides player from WHO list.
  - @oemit can take a room dbref, behaving like @remit with an exception.
  - mortal_dark and wizard attribute flags are settable. 'm' and 'w'.
  - @pcreate power added.
  - Channels can be wiped.
 
New functions:
  - Visible(): can one object examine another object or attribute?
  - Items(), Element(): like Words() and Match(), but for arbitrary separators.
  - Delete(), Replace(), Insert(): list-manipulation, arbitrary separators.
  - Orflags(), Andflags(): check multiple flags.
  - Fullname(): full name of an object.
  - Many floating point functions.
 
Other changes:
  - Lattr() can take an <obj>/<wildcard> pattern.
  - @prefix and @inprefix do pronoun substitution.
  - @search can take an 'eval' parameter.
  - No second arg to @lock or @link unlocks/unlinks.
  - Mail() can now, for wizards, give info about other players' mail.
  - Sort() now 'autodetects' sort type. Nsort() has been removed.
  - Get_eval() is an alias for U() rather than Eval().
  - Non-listening objects trigger @aenter and @aleave.
  - @search, @find, and examine always ignore the MYOPIC flag.
  - Queue deposits get refunded at startup.
  - Words() uses ' ' as the delimiter, _not_ any whitespace.
 
Major bugfixes:
  - Many problems with flags have been fixed.
  - "#123's foo" is no longer matched the same as "#123".
  - Switch() nesting behaves properly.
  - Parser bug with '/' in pre-parsed attribute names fixed.
  - Remove() no longer screws up on things like 'remove(#434 #43 #22,#43)'
  - Index() and friends no longer screw up on null separators.
  - Squish() trims leading spaces properly.
  - Various bugs with setfunctions fixed.
  - Function recursion bug fixed.
  - @scan no longer chokes on '='.
  - no_inherit attribute flag works for real.
 
& 1.50p7
Version 1.50 patchlevel 7

Patchlevel 7 Changes
 
Major new features:
  - Powers system. Individual objects and players can be given the ability
    to do special things, such as "examine anything", "teleport anywhere",
    "boot players", etc. The BUILDER and IMMORTAL flags are now powers.
  - Expanded flag system. Some flags are valid for more types of objects,
    and flag lookups are quicker. The flag order is now alphabetized,
    first by "generic" object type, then by specific object type.
  - User-defined global functions, which behave just like built-in MUSH
    functions, but are programmed in MUSH in a UFUN() format (i.e. you
    can call them like any other function, i.e.  '@emit [my_function(foo)]')
    The "@function" command is used to define and list these functions.
  - Local variables (registers, numbered 0-9) which are retained for
    the duration of a single command. Extremely useful for storing long
    function evaluations, especially if you are programming "switchless".
    The setq() and r() functions are used to set and retrieve the registers.
  
New additions:
  - "no_clone" attribute flag (do not copy attribute when object is @clone'd)
  - "@config/functions" lists all functions.
 
New functions:
  - squish() removes leading and trailing spaces from a string, and crunches
    inter-word spaces down to a single space.
  - filter() returns members of a list for which a user-def'ed function
    evalutes to true ("1").
  - fold() recursively evaluates a user-def'ed function and list.
  - rjust() and ljust() pad strings with spaces (or another fill character)
  - nsort() sorts a list of numbers.
  - shuffle() randomizes order of elements in a list.
  - scramble() randomizes order of characters in a string.
  
Other changes:
  - cat() can take an arbitrary number of arguments.
  - conn() and idlesecs() now recognize #dbref and *player. idle() is now
    an alias for idlesecs().
  - "Exits:" line in examine is back.
  - examine on non-existent attribute(s) returns "No matching attributes."
  - NO_COMMAND doesn't block ^, since you have to set the LISTENER flag anyway.
  - @config shows a couple more options.
  - The QUIET flag suppresses "Drained.", "Notified.", and "Halted."
  - Debug and Verbose output no longer clobber the stack.
  - switch() and iter() nested within other functions works properly.
  - Players cannot enter objects remotely via dbref.

& 1.50p6
Version 1.50 patchlevel 6

Patchlevel 6 Changes
 
Major bugfixes:
  - Eval locks work with get(), ufun(), etc.
  - Rooms can use @trigger again.
  
Changes to the parser:
  - Spaces are no longer added around equals signs in 'say', 'pose', etc.
  - The construction '<name of object> <command>' can no longer be used to
    force a nearby object. '<dbref of object> <command>' still works.
  - ITER() is much better-behaved; escapes and braces in the second
    argument are no longer needed. It also now works properly with ufun().
  - switch() can now take up to 100 arguments. Arguments to it are not
    evaluated until needed.
  
Miscellaneous changes:
  - Royalty can now set themselves DARK, but this affects _only_ their
    visibility on the WHO list and related functions; they still appear
    in the visible contents list of a room, on channel who, etc.
  - Royalty can set themselves MONITOR.
  - The TERSE flag suppresses _only_ auto-look messages (so if you type
    'look here' while TERSE, you will get the description of the room).
  - VAL() function returns the leading numeric prefix of a string.
  - INDEX() is an extract()-like function which works for an arbitrary
    character separator.
  - WHERE() returns the "true" location of an object.
  - HOME(), etc. now works on objects you do not control but are VISUAL.
  - REPEAT() of something zero times returns a blank string, not an error.
  - Commands done in GOING rooms are no longer considered invalid.
  - "@parent <object>" by itself unparents an object.
  - Exits in the same room as you are considered "nearby".
  - All attribute fetches use the same permission checks. LINK_OK on a
    zone object no longer allows zfun() to be done on the object if
    the attribute cannot normally be read.
  - Attribute flag sets added (@set obj/atr = flag). There are three
    settable flags, 'visual', 'no_command', and 'no_inherit'. 'Examine'
    displays these as 'v', '$', and 'i'.
  - The lcon(), lexits(), con(), exit(), and next() functions now check
    permissions differently. You can use these functions on a location 
    that you own, or in a location that you are in and is not DARK.
    If you cannot check the room, these functions will return #-1 even
    if you have objects/exits in the room. This behavior is identical
    to TinyMUSH 2.0's, and provides more privacy.
  - 'examine' output for objects you don't control is now similar to
    TinyMUSH 2.0's. The option to examine public attributes by default
    is configurable.

& patchlevels
For information on a specific patchlevel of one of the versions listed,
type 'help <version>p<patchlevel>'. For example, 'help 1.7.2p3'

1.7.6: 0
1.7.5: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
1.7.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
       19, 20
1.7.3: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
1.7.2: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
       19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
1.7.1: 0, 1, 2, 3
1.7.0: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11
1.6.10: 0, 1, 2, 3, 4, 5, 6, 6
1.6.9: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
1.6.8: 0, 1
1.6.7: 0, 1, 2, 3, 4, 5, 6
1.6.6: 0
1.6.5: 0, 1, 2, 3, 4
1.6.4: 0, 1, 2
1.6.3: 0, 1, 2, 3, 4, 5, 6, 7
1.6.2: 0, 1
1.6.1: 0, 1
1.6.0: 0, 3, 4, 5
1.50: dune2, dune1, 6, 7, 8, 9, 10, 11, 12, 13, 14

& Entries
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 "                         $-commands                $-commands2              
 %                         %!                        %#                       
 %n                        +                         1.50p6                   
 1.50p7                    1.50p8                    1.50p9                   
 1.50p10                   1.50p11                   1.50p12                  
 1.50p13                   1.50p14                   1.50pdune1               
 1.50pdune2                1.6.0p0                   1.6.0p3                  
 1.6.0p4                   1.6.0p5                   1.6.1p0                  
 1.6.1p1                   1.6.10p0                  1.6.10p1                 
 1.6.10p2                  1.6.10p3                  1.6.10p4                 
 1.6.10p5                  1.6.10p6                  1.6.10p6                 
 1.6.2p0                   1.6.2p1                   1.6.3p0                  
 1.6.3p1                   1.6.3p2                   1.6.3p3                  
 1.6.3p4                   1.6.3p5                   1.6.3p6                  
 1.6.3p7                   1.6.4p0                   1.6.4p1                  
 1.6.4p2                   1.6.5p0                   1.6.5p1                  

For more, see Entries-2
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-2
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 1.6.5p2                   1.6.5p3                   1.6.5p4                  
 1.6.6p0                   1.6.7p0                   1.6.7p1                  
 1.6.7p2                   1.6.7p3                   1.6.7p4                  
 1.6.7p5                   1.6.7p6                   1.6.8p0                  
 1.6.8p1                   1.6.9p0                   1.6.9p1                  
 1.6.9p2                   1.6.9p3                   1.6.9p4                  
 1.6.9p5                   1.6.9p6                   1.6.9p7                  
 1.6.9p8                   1.6.9p9                   1.7.0p0                  
 1.7.0p1                   1.7.0p2                   1.7.0p3                  
 1.7.0p4                   1.7.0p5                   1.7.0p6                  
 1.7.0p7                   1.7.0p8                   1.7.0p9                  
 1.7.0p10                  1.7.0p11                  1.7.0p11                 
 1.7.1p0                   1.7.1p1                   1.7.1p2                  
 1.7.1p3                   1.7.2p0                   1.7.2p1                  
 1.7.2p2                   1.7.2p3                   1.7.2p4                  
 1.7.2p5                   1.7.2p6                   1.7.2p7                  

For more, see Entries-3
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-3
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 1.7.2p8                   1.7.2p9                   1.7.2p10                 
 1.7.2p11                  1.7.2p12                  1.7.2p13                 
 1.7.2p14                  1.7.2p15                  1.7.2p16                 
 1.7.2p17                  1.7.2p18                  1.7.2p19                 
 1.7.2p20                  1.7.2p21                  1.7.2p22                 
 1.7.2p23                  1.7.2p24                  1.7.2p25                 
 1.7.2p26                  1.7.2p27                  1.7.2p28                 
 1.7.2p29                  1.7.2p30                  1.7.2p31                 
 1.7.2p32                  1.7.2p33                  1.7.2p34                 
 1.7.2p35                  1.7.3p0                   1.7.3p1                  
 1.7.3p2                   1.7.3p3                   1.7.3p4                  
 1.7.3p5                   1.7.3p6                   1.7.3p7                  
 1.7.3p8                   1.7.3p9                   1.7.3p10                 
 1.7.3p11                  1.7.3p12                  1.7.3p13                 
 1.7.3p14                  1.7.4p0                   1.7.4p1                  
 1.7.4p2                   1.7.4p3                   1.7.4p4                  

For more, see Entries-4
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-4
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 1.7.4p5                   1.7.4p6                   1.7.4p7                  
 1.7.4p8                   1.7.4p9                   1.7.4p10                 
 1.7.4p11                  1.7.4p12                  1.7.4p13                 
 1.7.4p14                  1.7.4p15                  1.7.4p16                 
 1.7.4p17                  1.7.4p18                  1.7.4p19                 
 1.7.4p20                  1.7.5p0                   1.7.5p1                  
 1.7.5p2                   1.7.5p3                   1.7.5p4                  
 1.7.5p5                   1.7.5p6                   1.7.5p7                  
 1.7.5p8                   1.7.5p9                   1.7.5p10                 
 1.7.5p11                  1.7.5p12                  1.7.6p0                  
 :                         ;                         @-attributes             
 @-building                @-general                 @-wizard                 
 @@                        @@()                      @aahear                  
 @aclone                   @aconnect                 @adeath                  
 @adescribe                @adestroy                 @adisconnect             
 @adrop                    @aefail                   @aenter                  

For more, see Entries-5
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-5
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 @afailure                 @afollow                  @agive                   
 @ahear                    @aidescribe               @aleave                  
 @alfail                   @alias                    @allhalt                 
 @allquota                 @amhear                   @amove                   
 @apayment                 @areceive                 @asuccess                
 @atport                   @atrchown                 @atrlock                 
 @attribute                @aufail                   @aunfollow               
 @ause                     @away                     @azenter                 
 @azleave                  @boot                     @break                   
 @cemit                    @channel                  @channel2                
 @channel3                 @channel4                 @channel5                
 @charges                  @chat                     @chown                   
 @chownall                 @chzone                   @chzone2                 
 @chzoneall                @clock                    @clock2                  
 @clone                    @command                  @comment                 
 @config                   @config attribs           @config chat             

For more, see Entries-6
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-6
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 @config cmds              @config cosmetic          @config cosmetic2        
 @config costs             @config db                @config dump             
 @config funcs             @config limits            @config limits2          
 @config log               @config net               @config parameters       
 @config tiny              @conformat                @cost                    
 @cpattr                   @create                   @dbck                    
 @death                    @decompile                @decompile2              
 @decompile3               @describe                 @destroy                 
 @destroy2                 @dig                      @dig2                    
 @disable                  @doing                    @dolist                  
 @drain                    @drop                     @dump                    
 @ealias                   @edit                     @efail                   
 @elock                    @emit                     @enable                  
 @enter                    @entrances                @eunlock                 
 @exitformat               @failure                  @filter                  
 @filter2                  @find                     @firstexit               

For more, see Entries-7
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-7
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 @follow                   @force                    @force2                  
 @forwardlist              @function                 @function2               
 @function3                @function4                @gedit                   
 @give                     @grep2                    @grep                    
 @halt                     @haven                    @hide                    
 @hook                     @hook2                    @idescribe               
 @idle                     @infilter                 @inprefix                
 @kick                     @lalias                   @leave                   
 @lemit                    @lfail                    @link                    
 @list                     @listen                   @listen2                 
 @listmotd                 @lock                     @lock2                   
 @lock3                    @lock4                    @lock5                   
 @lock6                    @lock7                    @lock8                   
 @lock9                    @log                      @logwipe                 
 @lset                     @map2                     @mail                    
 @malias                   @malias2                  @malias3                 

For more, see Entries-8
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-8
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 @malias4                  @malias5                  @map                     
 @motd                     @move                     @mvattr                  
 @name                     @nameaccent               @nameformat              
 @newpassword              @notify                   @nspemit                 
 @nuke                     @odeath                   @odescribe               
 @odrop                    @oefail                   @oemit                   
 @oenter                   @ofailure                 @ofollow                 
 @ogive                    @oidescribe               @oleave                  
 @olfail                   @omove                    @opayment                
 @open                     @oreceive                 @osuccess                
 @otport                   @oufail                   @ounfollow               
 @ouse                     @oxenter                  @oxleave                 
 @oxmove                   @oxtport                  @ozenter                 
 @ozleave                  @parent                   @password                
 @payment                  @pcreate                  @pemit                   
 @pemit2                   @poll                     @poor                    

For more, see Entries-9
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-9
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 @power                    @prefix                   @ps                      
 @purge                    @quota                    @readcache               
 @receive                  @recycle                  @rejectmotd              
 @remit                    @restart                  @runout                  
 @rwall                    @rwallemit                @rwallpose               
 @scan                     @search                   @search2                 
 @search3                  @select                   @set                     
 @sex                      @shutdown                 @sitelock                
 @sitelock2                @sitelock3                @squota                  
 @startup                  @stats                    @success                 
 @sweep                    @switch                   @switch2                 
 @teleport                 @tport                    @trigger                 
 @trigger2                 @ufail                    @ulock                   
 @undestroy                @unfollow                 @unlink                  
 @unlock                   @unrecycle                @uptime                  
 @uptime2                  @use                      @uunlock                 

For more, see Entries-10
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-10
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 @verb                     @verb2                    @verb3                   
 @verb4                    @version                  @vrml_url                
 @wait                     @wait2                    @wall                    
 @wallemit                 @wallpose                 @warnings                
 @warnings2                @warnings3                @wcheck                  
 @whereis                  @wipe                     @wizemit                 
 @wizmotd                  @wizpose                  @wizwall                 
 @zemit                    @zenter                   @zleave                  
 \                         ^                         abode                    
 abs()                     accent()                  accent2                  
 accent3                   accent4                   acos()                   
 action lists              action2                   add()                    
 after()                   ahelp                     alphamax()               
 alphamin()                and()                     andflags()               
 anews                     ansi                      ansi()                   
 aposs()                   art()                     asin()                   

For more, see Entries-11
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-11
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 atan()                    atan2()                   atrlock()                
 attrcnt()                 attrib-ownership          attribute flags          
 attribute functions       attribute list            attributes               
 attributes list           attributes2               attributes3              
 attributes4               audible                   audible2                 
 band()                    beep()                    before()                 
 being killed              bitwise functions         bnand()                  
 bnot()                    boolean functions         boolean values           
 boolean2                  boolean3                  bor()                    
 bound()                   brackets()                brief                    
 builder                   bxor()                    cand()                   
 capstr()                  case()                    caseall()                
 cat()                     cd                        ceil()                   
 cemit()                   center()                  cflags()                 
 ch                        changes                   channel functions        
 channel-list              channels()                chat                     

For more, see Entries-12
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-12
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 checkpass()               chown_ok                  chr()                    
 clients                   clock()                   clone()                  
 cloudy                    code                      color                    
 commands                  communication functions   comp()                   
 comsys                    con()                     config()                 
 conn()                    connected                 control                  
 controls()                convsecs()                convtime()               
 convutcsecs()             copyright                 copyrite                 
 cor()                     cos()                     costs                    
 create()                  credits                   ctime()                  
 ctitle()                  ctu()                     cv                       
 cwho()                    dark                      dark2                    
 database                  dbref #                   dbref functions          
 dbref number              dbref2                    dbrefs                   
 debug                     debug2                    dec()                    
 decrypt()                 default()                 delete()                 

For more, see Entries-13
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-13
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 desert                    destroy_ok                die()                    
 dig()                     dismiss                   dist2d()                 
 dist3d()                  div()                     doing                    
 doing()                   drop                      drop-tos                 
 e()                       edefault()                edit()                   
 element()                 elements()                elist()                  
 elock()                   emit()                    enactor                  
 encrypt()                 endtag()                  enter                    
 enter_ok                  entrances()               eq()                     
 escape()                  etimefmt()                etimefmt2                
 eval()                    evaluation order          evaluation2              
 events                    examine                   executor                 
 exit()                    exits                     exits2                   
 exp()                     extract()                 failure                  
 fdiv()                    filter()                  filterbool()             
 findable()                first()                   fixed                    

For more, see Entries-14
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-14
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 flag list                 flags                     flags list               
 flags()                   flags2                    flip()                   
 floating                  floating point functions  floor()                  
 floordiv()                fmod()                    fold()                   
 fold2                     folderstats()             follow                   
 followers()               following()               foreach()                
 foreach2                  fullname()                function list            
 functions                 functions()               functions2               
 gagged                    gender                    get                      
 get()                     get_eval()                give                     
 global commands           globals                   go                       
 going                     goto                      grab()                   
 graball()                 grep()                    grepi()                  
 gt()                      gte()                     halt                     
 hasattr()                 hasattrp()                hasattrpval()            
 hasattrval()              hasflag()                 haspower()               

For more, see Entries-15
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-15
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 hastype()                 haven                     help                     
 here                      hidden()                  home                     
 home()                    homes                     html                     
 html functions            html()                    i18n                     
 idle()                    idlesecs()                if()                     
 ifelse()                  ilev()                    iname()                  
 inc()                     index                     index()                  
 info                      information functions     inherit                  
 inherit2                  insert()                  interiors                
 interiors2                internationalization      inum()                   
 inventory                 isdaylight()              isdbref()                
 isint()                   isnum()                   isword()                 
 itemize()                 items()                   iter()                   
 iter2                     itext()                   judge                    
 jump_ok                   jury_ok                   kill                     
 last & lastlogout         last()                    lastip                   

For more, see Entries-16
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-16
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 lastsite                  lattr()                   lcon()                   
 lcstr()                   ldelete()                 leave                    
 left()                    lemit()                   lexits()                 
 license                   light                     link()                   
 link_ok                   linking                   list functions           
 list()                    listen_parent             listening                
 listening2                listening3                lists                    
 lit()                     ljust()                   lmath()                  
 ln()                      lnum()                    loc()                    
 locale                    localize()                locate()                 
 locate2                   lock list                 lock types               
 lock types2               lock()                    locking                  
 locklist                  locks                     locktypes                
 locktypes2                log()                     logout                   
 look                      look2                     looping                  
 lparent()                 lplayers()                lsearch()                

For more, see Entries-17
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-17
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 lsearch2                  lsearchr()                lstats()                 
 lt()                      lte()                     lvcon()                  
 lvexits()                 lvplayers()               lwho()                   
 macros                    macros2                   mail                     
 mail functions            mail()                    mail-admin               
 mail-folders              mail-other                mail-reading             
 mail-sending              maildstats()              mailfrom()               
 mailfstats()              mailstats()               mailstatus()             
 mailsubject()             mailtime()                map()                    
 master room               match()                   matchall()               
 matching                  math functions            max()                    
 me                        mean()                    median()                 
 member()                  merge()                   mid()                    
 min()                     mix()                     mix2                     
 mod()                     modulo()                  modulus()                
 money                     money()                   monitor                  

For more, see Entries-18
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-18
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 mortal                    move                      mtime()                  
 mudname()                 mul()                     munge()                  
 munge2                    munge3                    mushcode                 
 mushcode2                 mwho()                    myopic                   
 name()                    nand()                    nattr()                  
 nearby()                  neq()                     new locks                
 newbie                    newbie2                   newbie3                  
 news                      next()                    no_command               
 no_leave                  no_tel                    no_warn                  
 noaccents                 noleave                   non-standard attributes  
 nor()                     nospoof                   not()                    
 nowarn                    nspemit()                 null()                   
 num()                     obj()                     object parents           
 objeval()                 objmem()                  oemit()                  
 on-vacation               opaque                    open()                   
 or()                      ord()                     orflags()                

For more, see Entries-19
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-19
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 owner()                   page                      page2                    
 paranoid                  parent                    parent()                 
 parents                   parents2                  parents3                 
 parents4                  parents5                  parse()                  
 patchlevels               pcreate()                 pemit()                  
 pi()                      player                    playermem()              
 pmatch()                  poll()                    ports()                  
 pos()                     pose                      pose2                    
 poss()                    power()                   powers list              
 powers list2              powers()                  powers2                  
 pueblo                    pueblo features           pueblo()                 
 puppet                    puppets                   puppets2                 
 queue                     quiet                     quit                     
 quota()                   r()                       r-function               
 rand()                    read                      regedit()                
 regeditall()              regeditalli()             regediti()               

For more, see Entries-20
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-20
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 regexp                    regexp classes            regexp classes2          
 regexp examples           regexp syntax             regexp syntax2           
 regexp syntax3            regexp syntax4            regexp syntax5           
 regexp syntax6            regexp syntax7            regexp syntax8           
 regexps                   regexps2                  registers                
 registers2                regmatch()                regrab()                 
 regraball()               regraballi()              regrabi()                
 regrep()                  regular expression functions                       
 remainder()               remit()                   remove()                 
 repeat()                  replace()                 rest()                   
 restarts()                restarttime()             restrict                 
 restrict2                 restrict3                 reverse()                
 revwords()                right()                   rjust()                  
 rloc()                    rnum()                    room                     
 room()                    round()                   royalty                  
 rquota                    rules                     s()                      

For more, see Entries-21
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-21
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 s-function                safe                      say                      
 score                     scramble()                search()                 
 search2                   secs()                    secure()                 
 semaphores                semaphores2               semaphores3              
 semaphores4               semaphores5               semaphores6              
 semipose                  session                   set()                    
 setdiff()                 setinter()                setq()                   
 setq2                     setq3                     setr()                   
 setting-attributes        setunion()                sex                      
 sha1()                    shared                    shared players           
 shared players2           shl()                     shr()                    
 shuffle()                 sign()                    sin()                    
 slay                      softcode                  sort()                   
 sortby()                  soundex()                 soundex2                 
 soundlike()               soundslike()              space()                  
 spellnum()                splice()                  spoofing                 

For more, see Entries-22
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-22
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 sqrt()                    squish()                  stack                    
 starttime()               stats()                   stddev()                 
 step2                     step()                    sticky                   
 strcat()                  string functions          strings                  
 strinsert()               stripaccents()            stripansi()              
 strlen()                  strmatch()                sub()                    
 subj()                    substitutions             substitutions2           
 substitutions3            substitutions4            success                  
 suspect                   switch wildcards          switch()                 
 switch2                   switchall()               switches                 
 t()                       table()                   tag()                    
 tagwrap()                 take                      tan()                    
 teach                     tel()                     tel_ok                   
 temple                    terse                     textfile()               
 think                     time functions            time()                   
 timefmt()                 timefmt2                  timestring()             

For more, see Entries-23
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-23
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 topics                    topics2                   translation              
 transparent               transparent2              trim()                   
 trunc()                   trust                     trust2                   
 type()                    types of objects          types2                   
 u()                       u2                        u3                       
 ucstr()                   udefault()                ufun()                   
 ufun2                     ufun3                     uldefault()              
 ulocal()                  ulocal2                   unfindable               
 unfollow                  uninspected               unregistered             
 use                       user-defined commands     user-defined2            
 utctime()                 utility functions         v()                      
 v-function                vadd()                    val()                    
 valid()                   vdim()                    vdot()                   
 verbose                   verbs                     version()                
 visible()                 visual                    vmag()                   
 vmax()                    vmin()                    vmul()                   

For more, see Entries-24
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
& Entries-24
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 vrml                      vsub()                    vunit()                  
 warnings                  warnings list             warnings list2           
 where()                   whisper                   whisper2                 
 who                       wildcards                 wipe()                   
 with                      wizard                    wordpos()                
 words()                   wrap()                    xget()                   
 xor()                     z_tel                     zemit()                  
 zfun()                    zmo                       zmp                      
 zmr                       zone                      zone master objects      
 zone master rooms         zone masters              zone objects             
 zone()                    zones                     zones2                   

& &Entries
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 &help                                                                        
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
