[PENNMUSH-ANNOUNCE] 1.7.5-patch10

dunemush@pennmush.org dunemush at pennmush.org
Thu, 19 Sep 2002 21:50:38 -0500


This is patch10 to PennMUSH 1.7.5. After applying this patch, you will
have version 1.7.5p10

To apply this patch, save it to a file in your top-level MUSH directory,
and do the following:
	patch -p1 < 1.7.5-patch10
	make install

If you use GNU patch 2.2, you probably want the above to be 'patch -b -p1',
not just 'patch -p1'.

Unix (or cygwin) users need not worry about failed hunks in src/switchinc.c,
hdrs/switches.h, hdrs/cmds.h, or hdrs/funs.h. These files are automatically
rebuilt on compile.

Then @shutdown and restart your MUSH.
    - Alan/Javelin

In this patch:

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

Prereq: 1.7.5p9
*** 1_7_5.225/Patchlevel Sat, 20 Jul 2002 12:00:21 -0500 dunemush (pennmush/5_Patchlevel 1.17.1.10 600)
--- 1_7_5.312(w)/Patchlevel Thu, 19 Sep 2002 12:33:56 -0500 dunemush (pennmush/5_Patchlevel 1.17.1.10 600)
***************
*** 1,2 ****
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.5p9
--- 1,2 ----
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.5p10
*** 1_7_5.225/README Tue, 14 May 2002 23:18:56 -0500 dunemush (pennmush/4_README 1.9 600)
--- 1_7_5.312(w)/README Fri, 13 Sep 2002 12:03:04 -0500 dunemush (pennmush/4_README 1.11 600)
***************
*** 27,48 ****
  numbers (like 1.7.2) and patchlevels (like p32), usually written
  together (1.7.2p32). 
  
! Starting with 1.7.2, version numbers that are even (like 1.7.2)
! are stable releases - patchlevels on the latest stable release
! will only be issued to fix serious bugs. Version numbers that are
! odd (like 1.7.3) are development releases - patchlevels on the
! latest development release may include new features as well
! as bugfixes, and development releases may not be as stable
! as stable releases.
!  
! PennMUSH is a TinyMUD derivative, and one of the branches along the
! MUSH line. "Vanilla" TinyMUSH, which added the "v" registers and
! functions to the basic TinyMUD building commands, was written by Larry
! Foard. The code was later expanded by Jin, of MicroMUSH. In January of
! 1991, MicroMUSH changed its name to MicroMUSE, and the code there
! continued to develop under the MUSE name. At that same point in time,
! Moonchilde took the last public release of that code and began a series
! of improvements and extensions.
  
  That code was released as PernMUSH, named for the MUSH that Moonchilde
  was running. The last released version of that code was version 1.15,
--- 27,50 ----
  numbers (like 1.7.2) and patchlevels (like p32), usually written
  together (1.7.2p32). 
  
! Starting with 1.7.2, version numbers that are even (like 1.7.2) are
! stable releases - patchlevels on the latest stable release will only be
! issued to fix serious bugs. Version numbers that are odd (like 1.7.3)
! are development releases - patchlevels on the latest development release
! may include new features as well as bugfixes, and development releases
! may not be as stable as stable releases. On the other hand, some new
! features may *increase* stability without fixing bugs per se, and it's
! quite likely that later patchlevels on the development version will be
! more stable than those on the "stable" version.
! 
! PennMUSH is a TinyMUD derivative, and one of the branches along the MUSH
! line. "Vanilla" TinyMUSH, which added the "v" registers and functions to
! the basic TinyMUD building commands, was written by Larry Foard. The code
! was later expanded by Jin, of MicroMUSH. In January of 1991, MicroMUSH
! changed its name to MicroMUSE, and the code there continued to develop
! under the MUSE name. At that same point in time, Moonchilde took the
! last public release of that code and began a series of improvements
! and extensions.
  
  That code was released as PernMUSH, named for the MUSH that Moonchilde
  was running. The last released version of that code was version 1.15,
***************
*** 112,118 ****
  directory contains files of using in building for OS/2.
  
  
!  top-level-+-> src
             +-> hdrs 
             +-> game ------+-> data 
             |              |   
--- 114,120 ----
  directory contains files of using in building for OS/2.
  
  
!  pennmush--+-> src
             +-> hdrs 
             +-> game ------+-> data 
             |              |   
***************
*** 140,232 ****
  
       Here's the process in detail:
  
! 1. If you're running on win32 (either 95 or NT, that is), 
! you have two options: compile with MS VC++ or compile with
! the cygwin32 unix emulation tools.
! 
! If you want to compile with MS VC++, follow the instructions
! in win32/README.txt and then skip down to step #6 below.
! 
! If you want to compile with cygwin, install the cygwin32
! unix emulation tools (available free from Cygnus at
! http://www.cygnus.com/misc/gnu-win32/).  You'll want the entire Cygnus
! Developer's Kit (cdk), notably including 'make' and 'patch'.  These are
! required for compiling PennMUSH.  Make sure you set up your environment
! variables properly as discussed in the Kit's installation instructions.
! 
! VERY IMPORTANT: The rest of the instructions assume that you have
! started up a bash shell and are running commands under that shell --
! they won't work right if run directly from a DOS shell.
! 
! VERY IMPORTANT: cygwin32's bin directory (usually something horrible like
! /gnuwin32/b18/h-i386-cygwin32/bin) must appear in your path
! *before* c:\windows\command does, so that 'sort' calls the good
! GNU sort, and not the bad Windows sort.
! 
! Optionally, install Microsoft's Visual C++ compiler.  If you want
! to use it, make sure 'cl' (the command line compiler) is in your
! PATH.
! 
! If you're running under Windows NT, you may wish to edit src/bsd.c
! and uncomment the #define NT_TCP option at the top. If you can
! build with this, you'll get greatly enhanced network i/o performance.
! This does not work on Windows 95/98.
! 
! 2. Type 'sh Configure' in the top directory. This script will
! ask you some questions and attempt to identify the proper Makefile
! settings for your system. The default answers are very likely to be
! correct, except that if you have gcc 2.0 or later, you should generally
! prefer to compile with that than with your system's cc compiler.  If
! you don't want to answer the questions you can try "sh Configure -d"
! which simply accepts all the defaults. This works right on most
! systems, though you may prefer "sh Configure -d -D cc=gcc" to use gcc.
! 
! Win32 has two different configuration sets: 'win32' and 'win32-gcc'.
! The former (which is default) uses Microsoft's compiler to produce
! a native executable.  The latter (which uses gcc from the Cygnus
! tools) doesn't require Microsoft's compiler (and thus you don't have
! to pay for it), but the resulting executable will not run without
! Cygnus' tools on the system.  You may select between these configuration
! sets when Configure asks which hints file to use.  When switching
! between these configurations, make sure to delete 'config.sh' before
! running Configure.
! 
  
  3. EITHER:
  
! Then, copy options.h.dist to options.h. Note that these files stay in
! the top directory.
  
  Edit the file. It's liberally commented. 
  
! Also, cp game/mushcnf.dst to game/mush.cnf.
  
  OR:
  
  Type 'make update', and answer all the questions about which MUSH
  options you want.
  
! You do not need to change any of the other header files.
  
  4. Do a "make install". This will build all the necessary files, and
  set up some symbolic links for the restart script.  You will probably
  receive a few compilation warnings, which can generally be ignored.
  
- Under win32 using the Microsoft compiler, the make will abort when
- trying to build info_slave.  This is all right; you don't need the
- info_slave. 
- 
- Under win32 using gcc, copy src/netmud.exe to game/netmush.exe,
- and src/info_slave.exe to game/info_slave.exe.  Note the name change
- for netmud -> netmush.
- 
  5. If you plan to run multiple MUSHes, you may want to do a "make
  customize" which will run a script to help set up a separate customized
  game subdirectory for each MUSH (run it once per MUSH you plan to run).
  Files in these subdirectories will already be customized in many ways,
  so what follows may be slightly different. :)
  
! 6. Read game/README and follow those instructions.
  
  
  PennMUSH has been tested on a fairly wide variety of machines and
--- 142,213 ----
  
       Here's the process in detail:
  
! 1. If you're running on win32, there are two options known to work:
!    a. Compile with MS VC++. If you want to do this, read win32/README.txt
!       and then skip down to step #6 below
!    b. Compile with the Cygwin unix emulation tools (http://www.cygwin.com)
!       In addition to the base cygwin stuff, you'll want the following packages:
!          binutils, gcc, make, patch, perl
!       These are also recommended:
!          gettext, gettext-devel, indent, vim or emacs
!       It is recommended that you install the tools under C:\CYGWIN and
!       that you read the Cygwin FAQ if you get messages about HOME not set.
! 
!       Put the pennmush .tar.gz file in C:\CYGWIN\USR\SRC. Don't uncompress
!       it with Winzip or other windows tools!
! 
!       VERY IMPORTANT: The rest of the instructions assume that you have
!       started up a bash shell and are running commands under that shell --
!       they won't work right if run directly from a DOS shell.
! 
!         cd /usr/src, and unpack the .tar.gz file with:
! 	      tar xfz pennmush-whatever.tar.gz
! 
! 2. cd pennmush. On Unix systems:
! 	./Configure -d
! 
!    On cygwin systems:
! 	. Configure
!      (That's a single period, a space, and Configure)
!      When you get to the question about hints files, choose 'cygwin'.
!      For all other questions, the defaults should work.
  
  3. EITHER:
  
! Copy options.h.dist to options.h. Note that these files stay in the
! pennmush directory.
  
  Edit the file. It's liberally commented. 
  
! On Cygwin systems, you should *not* define NT_TCP with cygwin, and you
! should use MALLOC_PACKAGE 0. You may use an COMPRESSION_TYPE you prefer.
! 
! Also, cp game/mushcnf.dst to game/mush.cnf and edit. 
! 
! On cygwin systems, you probably should not use compressed database,
! so modify that bit.
  
  OR:
  
  Type 'make update', and answer all the questions about which MUSH
  options you want.
  
! You should not need to change any of the other header files.
  
  4. Do a "make install". This will build all the necessary files, and
  set up some symbolic links for the restart script.  You will probably
  receive a few compilation warnings, which can generally be ignored.
  
  5. If you plan to run multiple MUSHes, you may want to do a "make
  customize" which will run a script to help set up a separate customized
  game subdirectory for each MUSH (run it once per MUSH you plan to run).
  Files in these subdirectories will already be customized in many ways,
  so what follows may be slightly different. :)
  
! 6. Read game/README and follow those instructions. 
! 
!    On cygwin systems, you will likely have to edit the game/restart
!    script and explicitly set GAMEDIR (to /usr/src/pennmush/game)
  
  
  PennMUSH has been tested on a fairly wide variety of machines and
***************
*** 345,351 ****
  want to customize their MUSH server, and don't feel like compiling
  it themselves.  This binary distribution does not contain the src,
  hdrs, hints, or os2 directories and is missing several key files
! (like Configure) from the top-level directory.  It does include the
  dune.h and options.h that it was built with, as an aid to those who
  decide late that they want to customize the server; they are useful
  as a baseline to work from.
--- 326,332 ----
  want to customize their MUSH server, and don't feel like compiling
  it themselves.  This binary distribution does not contain the src,
  hdrs, hints, or os2 directories and is missing several key files
! (like Configure) from the pennmush directory.  It does include the
  dune.h and options.h that it was built with, as an aid to those who
  decide late that they want to customize the server; they are useful
  as a baseline to work from.
*** 1_7_5.225/CHANGES.174 Sat, 20 Jul 2002 12:05:06 -0500 dunemush (pennmush/8_CHANGES 1.219.1.72.1.70 600)
--- 1_7_5.312(w)/CHANGES.174 Thu, 19 Sep 2002 12:33:19 -0500 dunemush (pennmush/8_CHANGES 1.219.1.72.1.78 600)
***************
*** 18,33 ****
  
  ==========================================================================
  
! Version 1.7.4 patchlevel 20		       June 14, 2002
  
  Fixes:
    * Help semaphores4 typo fixed by Mike Griffiths.
    * 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]
  
  Version 1.7.4 patchlevel 19		       June 14, 2002
  
--- 18,50 ----
  
  ==========================================================================
  
! 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
+ 
  
  Version 1.7.4 patchlevel 19		       June 14, 2002
  
*** 1_7_5.225/CHANGES Sat, 20 Jul 2002 12:00:21 -0500 dunemush (pennmush/g/7_CHANGES 1.27.1.49 600)
--- 1_7_5.312(w)/CHANGES Thu, 19 Sep 2002 21:48:53 -0500 dunemush (pennmush/g/7_CHANGES 1.27.1.85 600)
***************
*** 18,30 ****
  
  ==========================================================================
  
  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]
--- 18,106 ----
  
  ==========================================================================
  
+ 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.
+ 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.
+ 
  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]
***************
*** 99,105 ****
      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
--- 175,181 ----
      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
***************
*** 150,156 ****
    * @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]
  
  
--- 226,232 ----
    * @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]
  
  
***************
*** 173,181 ****
      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
--- 249,257 ----
      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
*** 1_7_5.225/BUGS Sat, 15 Apr 2000 10:56:00 -0500 dunemush (pennmush/9_BUGS 1.1 600)
--- 1_7_5.312(w)/BUGS Wed, 24 Jul 2002 20:59:56 -0500 dunemush (pennmush/9_BUGS 1.2 600)
***************
*** 1,4 ****
--- 1,9 ----
+ Bugs that aren't our fault, but might bite people with old compilers:
+ 
  * Ralph Melton reports that compiling with gcc 2.5.8 under SunOS 4.1.1
    using -O optimization and forking dumps causes the dump process to
    crash. Removing -O fixes the problem; so might using a more recent gcc.
+ * Javelin has confirmed that compiling with gcc 2.7.2.3 under Linux 2.2.16
+   using -O optimization causes ansi(rh,a) to crash. Removing -O fixes
+   the problem; so might using a more recent gcc
  
*** 1_7_5.225/game/txt/hlp/pennvers.hlp Sat, 20 Jul 2002 12:00:21 -0500 dunemush (pennmush/12_pennvers.h 1.169.1.42.1.3.1.2.2.2.1.1.1.3.1.1.1.5.1.4.1.1.1.1.1.1.1.1.1.5.1.1.1.5 600)
--- 1_7_5.312(w)/game/txt/hlp/pennvers.hlp Thu, 19 Sep 2002 21:48:54 -0500 dunemush (pennmush/12_pennvers.h 1.169.1.42.1.3.1.2.2.2.1.1.1.3.1.1.1.5.1.4.1.1.1.1.1.1.1.1.1.5.1.1.1.3.1.1.1.3.1.1.1.13 600)
***************
*** 1,5 ****
  & changes
! & 1.7.5p9
  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'
--- 1,5 ----
  & changes
! & 1.7.5p10
  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'
***************
*** 11,23 ****
  A list of the patchlevels associated with each release can
  be read in 'help patchlevels'.
  
  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]
--- 11,100 ----
  A list of the patchlevels associated with each release can
  be read in 'help patchlevels'.
  
+ 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.
+ 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]
***************
*** 94,100 ****
      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
--- 171,177 ----
      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
***************
*** 146,152 ****
    * @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]
  
  
--- 223,229 ----
    * @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]
  
  
***************
*** 170,178 ****
      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
--- 247,255 ----
      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
***************
*** 330,344 ****
    * Fixes up to 1.7.4p12 merged in.
  
  & 1.7.4p20
! Version 1.7.4 patchlevel 20		       June 14, 2002
  
  Fixes:
    * Help semaphores4 typo fixed by Mike Griffiths.
    * 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.
  
  
  & 1.7.4p19
--- 407,438 ----
    * Fixes up to 1.7.4p12 merged in.
  
  & 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
***************
*** 5457,5467 ****
      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.5: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  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
--- 5551,5891 ----
      TinyMUSH 2.0's. The option to examine public attributes by default
      is configurable.
  
+ & 1.7.5p10
+ Version 1.7.5 patchlevel 10                     July 16, 2002
+ 
+ Fixes:
+    * 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.
+ 
+ 
+ & 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.
+ 
  & 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.5: 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10
  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_5.225/game/txt/hlp/penntop.hlp Mon, 08 Jul 2002 21:42:23 -0500 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.2 600)
--- 1_7_5.312(w)/game/txt/hlp/penntop.hlp Tue, 17 Sep 2002 13:26:23 -0500 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.5 600)
***************
*** 171,177 ****
    OFAILURE      OLEAVE        OLFAIL        OMOVE         OPAYMENT      
    OSUCCESS      OXENTER       OXLEAVE       OXMOVE        PAYMENT       
    QUEUE (*)     RQUOTA (*)    RUNOUT        SEX           STARTUP       
!   SUCCESS
  
  (continued in help attributes2)
  & ATTRIBUTES2
--- 171,177 ----
    OFAILURE      OLEAVE        OLFAIL        OMOVE         OPAYMENT      
    OSUCCESS      OXENTER       OXLEAVE       OXMOVE        PAYMENT       
    QUEUE (*)     RQUOTA (*)    RUNOUT        SEX           STARTUP       
!   SUCCESS       TFPREFIX
  
  (continued in help attributes2)
  & ATTRIBUTES2
***************
*** 426,431 ****
--- 426,433 ----
    This is very useful for keeping rooms uncluttered. 
  
  See also: @link, STICKY, LINK_OK
+ & %#
+ & %N
  & ENACTOR
    The enactor is the object that does something (enacts something :).
    This is an important concept in MUSH, because the way many commands
***************
*** 481,486 ****
--- 483,489 ----
    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
***************
*** 1442,1447 ****
--- 1445,1451 ----
          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 % 
***************
*** 1672,1677 ****
--- 1676,1683 ----
    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
***************
*** 1802,1808 ****
                to @command or @function.
  
   Commands can also use the 'noplayer' restriction, which stops
!  player objects from using the command.
  
  (Continued in restrict3)
  & RESTRICT3
--- 1808,1815 ----
                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
*** 1_7_5.225/game/txt/hlp/pennmail.hlp Tue, 04 Sep 2001 08:19:24 -0500 dunemush (pennmush/15_pennmail.h 1.9 600)
--- 1_7_5.312(w)/game/txt/hlp/pennmail.hlp Sun, 15 Sep 2002 15:51:04 -0500 dunemush (pennmush/15_pennmail.h 1.10 600)
***************
*** 1,3 ****
--- 1,4 ----
+ & mail
  & @mail
    @mail[/<switches>] [<msg-list> [= <target>]]
    @mail[/<switches>] <player-list> = [<subject>/]<message>
*** 1_7_5.225/game/txt/hlp/pennfunc.hlp Sat, 20 Jul 2002 12:05:38 -0500 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.2 600)
--- 1_7_5.312(w)/game/txt/hlp/pennfunc.hlp Thu, 19 Sep 2002 12:35:44 -0500 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1 600)
***************
*** 32,38 ****
    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
--- 32,38 ----
    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
***************
*** 68,74 ****
    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.
--- 68,74 ----
    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.
***************
*** 93,99 ****
    gte()         lt()          lte()         nand()        neq()
    nor()         not()         or()          t()           xor()
      
! See also: BOOLEAN VALUES, @config
  & Channel functions
    Channel functions work with the channel system.
  
--- 93,99 ----
    gte()         lt()          lte()         nand()        neq()
    nor()         not()         or()          t()           xor()
      
!   See also: BOOLEAN VALUES, @config
  & Channel functions
    Channel functions work with the channel system.
  
***************
*** 114,120 ****
    pmatch()      rloc()        rnum()        room()        where()       
    zone()
    
! See also: DBREF
  & Information functions
    Information functions return values related to objects.
   
--- 114,120 ----
    pmatch()      rloc()        rnum()        room()        where()       
    zone()
    
!   See also: DBREF
  & Information functions
    Information functions return values related to objects.
   
***************
*** 160,184 ****
    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:
!   add()         bound()       lmath()       max()         mean()        
    median()      min()         mul()         sign()        stddev()      
    sub()         trunc()       val()
   
    These functions operate only on integers (if passed floating point
!   numbers, an error will be reported):
!   abs()         dec()         dist2d()      dist3d()      div()
!   mod()         inc()
  
    These functions operate only with floating point numbers:
!   acos()        asin()        atan()        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):
--- 160,184 ----
    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()         mod()
!   inc()
  
    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):
***************
*** 208,214 ****
    strcat()      strinsert()   stripaccent() stripansi()   strlen()
    switch()      trim()        ucstr()       wrap()
   
! See also: STRINGS
  & Time functions
    These functions return times or format times.
    
--- 208,214 ----
    strcat()      strinsert()   stripaccent() stripansi()   strlen()
    switch()      trim()        ucstr()       wrap()
   
!   See also: STRINGS
  & Time functions
    These functions return times or format times.
    
***************
*** 219,232 ****
  & Utility functions
    These functions don't quite fit into any other category.
    
!   ansi()        atrlock()     beep()        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()
--- 219,232 ----
  & 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()
***************
*** 314,325 ****
    > think accent(Khazad ai-menu!, Khaz^d ai-m^nu!)
    Khaz(a-with-^)d ai-m(e-with-^)nu!
  & ACOS()
!   acos(<cosine>)
   
    Returns the angle that has the given <cosine> (arc-cosine), with the
!   angle expressed in radians.
  
!   See HELP COS() for how to convert between radians and degrees.
  & ADD()
    add(<number>,<number>,...)
  
--- 314,325 ----
    > 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>,...)
  
***************
*** 361,367 ****
    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>)
  
--- 361,367 ----
    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>)
  
***************
*** 400,406 ****
   
    For example, "ansi(fc, Test)" would hilight "Test" in flashing cyan.
   
! See also: ANSI, COLOR, FORCE_WHITE
  & APOSS()
    aposs(<object>)
  
--- 400,406 ----
   
    For example, "ansi(fc, Test)" would hilight "Test" in flashing cyan.
   
!   See also: ANSI, COLOR 
  & APOSS()
    aposs(<object>)
  
***************
*** 412,430 ****
    This function returns the proper article, "a" or "an", based on whether
    or not <string> begins with a vowel.
  & ASIN()
!   asin(<sine>)
   
    Returns the angle with the given <sine> (arc-sine), with the angle
!   expressed in radians.
  
!   See HELP COS() for how to convert between radians and degrees.
  & ATAN()
!   atan(<tangent>)
!  
    Returns the angle with the given <tangent> (arc-tangent), with the
!   angle expressed in radians.
  
!   See HELP COS() for how to convert between radians and degrees.
  & ATRLOCK()
    atrlock(<object>/<attrib>[, <on|off>])
  
--- 412,437 ----
    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>])
  
***************
*** 567,572 ****
--- 574,588 ----
    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>)
***************
*** 587,593 ****
    If no locktype is given, "JOIN" is assumed.
    With two arguments, sets the lock.
  
!   See also @clock
  & CLONE()
    clone(<object>)
   
--- 603,609 ----
    If no locktype is given, "JOIN" is assumed.
    With two arguments, sets the lock.
  
!   See also: @clock
  & CLONE()
    clone(<object>)
   
***************
*** 595,605 ****
  
    This is a side-effect function and may not be enabled on some MUSHes.
  & COMP()
!   comp(<string1>, <string2>)
  
!   Comp compares two strings.  It returns 0 if they are the same, -1 if
!   string1 is less than/precedes alphabetically string2, and 1 
    otherwise.
  & CON()
    con(<object>)
  
--- 611,631 ----
  
    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>)
  
***************
*** 611,617 ****
    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>)
--- 637,643 ----
    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>)
***************
*** 630,636 ****
    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>)
    
--- 656,662 ----
    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>)
    
***************
*** 640,646 ****
    object). You must control <object> or <victim>, or have the See_All
    power, to use this function.
  
! See also: CONTROL
    
  & CONVSECS()
  & CONVUTCSECS()
--- 666,672 ----
    object). You must control <object> or <victim>, or have the See_All
    power, to use this function.
  
!   See also: CONTROL
    
  & CONVSECS()
  & CONVUTCSECS()
***************
*** 662,668 ****
    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>)
  
--- 688,694 ----
    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>)
  
***************
*** 684,700 ****
    > say [convtime(Wed Jun 24 10:22:54 1992)]
    You say, "709395774"
  
! See also: convsecs(), time()
  & COS()
!   cos(<angle>)
   
!   Returns the cosine of <angle>, which should be expressed in radians.
  
!   An angle in degrees can be converted to radians with the following:
!    fdiv(mul(DEGREES, pi()), 180)
  
!   An angle in radians can be converted to degrees with the following:
!    fdiv(mul(RADIANS, 180), pi())
  & PCREATE()
    pcreate(<name>,<password>)
  
--- 710,729 ----
    > 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>)
  
***************
*** 720,725 ****
--- 749,768 ----
    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>)
   
***************
*** 771,777 ****
      > say default(me/Test, No fruits!)
      You say "No fruits!"
   
!   See also:  get(), eval(), ufun(), edefault(), udefault(), uldefault().
   
  & DELETE()
    delete(<string>, <first>, <len>)
--- 814,820 ----
      > say default(me/Test, No fruits!)
      You say "No fruits!"
   
!   See also: get(), eval(), ufun(), edefault(), udefault(), uldefault()
   
  & DELETE()
    delete(<string>, <first>, <len>)
***************
*** 814,827 ****
    dist2d(x1, y1, x2, y2)
  
    Returns the distance between two points in the Cartesian
!   plane that have coordinates (x1, y1) and (x2, y2). Coordinates must
!   be integers, but dist2d can return a floating point number.
  & 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). All coordinates must
!   be integers, but dist3d can return a floating point number.
  & DIV()
  & FLOORDIV()
    div(<number>,<number>)
--- 857,868 ----
    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>)
***************
*** 841,858 ****
    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.718281).
  & EDEFAULT()
    Function:  edefault([<obj>/]<attr>,<default case>)
   
--- 882,900 ----
    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>)
   
***************
*** 870,876 ****
      > 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> ...])
--- 912,918 ----
      > 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> ...])
***************
*** 893,899 ****
  
    edit() can not replace a literal single ^ or $. Use regedit() for that.
    
!   See also @edit, regedit().
  & ELEMENT()
    element(<list>,<item>,<single-character separator>)
    
--- 935,941 ----
  
    edit() can not replace a literal single ^ or $. Use regedit() for that.
    
!   See also: @edit, regedit()
  & ELEMENT()
    element(<list>,<item>,<single-character separator>)
    
***************
*** 905,910 ****
--- 947,954 ----
    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>])
   
***************
*** 918,923 ****
--- 962,968 ----
      > say elements(Foof|Ack|Beep|Moo,3 1,|)
      You say "Beep|Foof"
  
+   See also: extract(), index(), grab()
  & ELOCK()
    elock(<object>[/<locktype>], <victim>)
  
***************
*** 933,939 ****
        think elock(Dancing Slippers/drop, Princess)
        > 0
    
! See also: @lock, locktypes
  & EMIT()
    emit(<message>)
  
--- 978,984 ----
        think elock(Dancing Slippers/drop, Princess)
        > 0
    
!   See also: @lock, locktypes
  & EMIT()
    emit(<message>)
  
***************
*** 970,976 ****
    Takes two integers, and returns 1 if they are equal, 0 otherwise.
    Will not work with characters.
    
! See also: neq(), match()
  & ESCAPE()
    escape(<string>)
   
--- 1015,1021 ----
    Takes two integers, and returns 1 if they are equal, 0 otherwise.
    Will not work with characters.
    
!   See also: neq(), match()
  & ESCAPE()
    escape(<string>)
   
***************
*** 1009,1015 ****
    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>)
  
--- 1054,1060 ----
    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>)
  
***************
*** 1021,1027 ****
    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>)
   
--- 1066,1072 ----
    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>)
   
***************
*** 1040,1046 ****
      think extract(This is a test string,3,2)
      > a test
  
! See also: index()
  & FDIV()
    fdiv(<numerator>,<denominator>)
   
--- 1085,1091 ----
      think extract(This is a test string,3,2)
      > a test
  
!   See also: index(), elements(), grab()
  & FDIV()
    fdiv(<numerator>,<denominator>)
   
***************
*** 1079,1085 ****
  
    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.
  & FLAGS()
    flags(<object>)
    flags(<object>/<attribute>)
--- 1124,1130 ----
  
    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>)
***************
*** 1230,1236 ****
    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)
!  
  & GRABALL()
  & REGRABALL()
  & REGRABALLI()
--- 1275,1282 ----
    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()
***************
*** 1252,1258 ****
    > say regraball(This is testing a test,s$)
    You say "This is"
    
!   See also: match(), matchall(), grab(), regmatch().
  & GREP()
  & REGREP()
    grep(<object>,<attrs>,<pattern>)
--- 1298,1304 ----
    > say regraball(This is testing a test,s$)
    You say "This is"
    
!   See also: match(), matchall(), grab(), regmatch()
  & GREP()
  & REGREP()
    grep(<object>,<attrs>,<pattern>)
***************
*** 1371,1377 ****
    if the <condition> is true, or <false expression> (if provided) if the
    <condition> is false.
  
! See also:  BOOLEAN VALUES, switch()
  & INAME()
    iname(<object>)
  
--- 1417,1423 ----
    if the <condition> is true, or <false expression> (if provided) if the
    <condition> is false.
  
!   See also:  BOOLEAN VALUES, switch()
  & INAME()
    iname(<object>)
  
***************
*** 1382,1388 ****
    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>)
--- 1428,1434 ----
    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>)
***************
*** 1420,1426 ****
      You say, "
      blue tribble^
      cute doll"
!   
  & INSERT()
    insert(<list>,<position>,<new item>[,<single-character separator>])
    
--- 1466,1473 ----
      You say, "
      blue tribble^
      cute doll"
! 
!   See also: extract(), elements(), grab()
  & INSERT()
    insert(<list>,<position>,<new item>[,<single-character separator>])
    
***************
*** 1445,1458 ****
    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>)
  
--- 1492,1505 ----
    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>)
  
***************
*** 1461,1467 ****
    the characters in the string must be digits, and an optional decimal
    point.
  
! See also: isint()
  & ISWORD()
    isword(<string>)
    
--- 1508,1514 ----
    the characters in the string must be digits, and an optional decimal
    point.
  
!   See also: isint()
  & ISWORD()
    isword(<string>)
    
***************
*** 1620,1626 ****
    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>)
  
--- 1667,1673 ----
    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>)
  
***************
*** 1658,1664 ****
    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>])
    
--- 1705,1711 ----
    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>])
    
***************
*** 1767,1773 ****
    > 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>)
   
--- 1814,1820 ----
    > 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>)
   
***************
*** 1841,1847 ****
    see_all power. You must be in <object> or control it to use this
    function.
  
! See also: lvplayers(), lcon()
  & LSEARCH()
  & SEARCH()
  & LSEARCHR()
--- 1888,1894 ----
    see_all power. You must be in <object> or control it to use this
    function.
  
!   See also: lvplayers(), lcon()
  & LSEARCH()
  & SEARCH()
  & LSEARCHR()
***************
*** 1913,1926 ****
    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>)
  
--- 1960,1973 ----
    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>)
  
***************
*** 1934,1940 ****
    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>)
--- 1981,1987 ----
    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>)
***************
*** 2023,2028 ****
--- 2070,2077 ----
    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>])
   
***************
*** 2038,2044 ****
    > say matchall(This is testing a test,tes*)
    You say "3 5"
   
!   See also: match(), strmatch(). 
  & MAX()
    max(<num1>, <num2>, ..., ...)
  
--- 2087,2093 ----
    > say matchall(This is testing a test,tes*)
    You say "3 5"
   
!   See also: match(), strmatch(), graball()
  & MAX()
    max(<num1>, <num2>, ..., ...)
  
***************
*** 2103,2109 ****
    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():
   
--- 2152,2158 ----
    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():
   
***************
*** 2141,2147 ****
  
    Mod and modulus are just aliases for modulo.
  
!   See also DIV.
  & MONEY()
    money(<object>)
    money(<integer>)
--- 2190,2196 ----
  
    Mod and modulus are just aliases for modulo.
  
!   See also: DIV
  & MONEY()
    money(<object>)
    money(<integer>)
***************
*** 2198,2204 ****
    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
--- 2247,2253 ----
    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
***************
*** 2211,2217 ****
    > 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 
--- 2260,2266 ----
    > 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 
***************
*** 2257,2263 ****
    [neq(<integer1>,<integer2>)]
  
    Basically the same as [not(eq(<integer1>,<integer2>))].
!   (see eq(), not())
  & NEXT()
    next(<object>)
  
--- 2306,2313 ----
    [neq(<integer1>,<integer2>)]
  
    Basically the same as [not(eq(<integer1>,<integer2>))].
! 
!   See also: eq(), not()
  & NEXT()
    next(<object>)
  
***************
*** 2275,2281 ****
    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>,...)
  
--- 2325,2331 ----
    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>,...)
  
***************
*** 2331,2337 ****
    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>)
--- 2381,2387 ----
    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>)
***************
*** 2356,2362 ****
    (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>)
    
--- 2406,2412 ----
    (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>)
    
***************
*** 2392,2398 ****
  & PI()
    pi()
    
!   Returns the value of "pi" (3.141593).
  & PLAYERMEM()
    playermem(<player>)
  
--- 2442,2449 ----
  & PI()
    pi()
    
!   Returns the value of "pi" (3.14159265358979323846264338327, rounded
!   to the game's float_precision setting).
  & PLAYERMEM()
    playermem(<player>)
  
***************
*** 2400,2418 ****
    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 identically 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. 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()
--- 2451,2469 ----
    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()
***************
*** 2478,2487 ****
  & REGEDITALL()
  & REGEDITI()
  & REGEDITALLI()
!   regedit(<string>, <regexp>, <replacement>)
!   regediti(<string>, <regexp>, <replacement>)
!   regeditall(<string>, <regexp>, <replacement>)
!   regeditalli(<string>, <regexp>, <replacement>)
  
    These functions are a version of edit() that uses regular expressions.
    The part of <string> that matches the <regexp> is replaced by the
--- 2529,2538 ----
  & 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
***************
*** 2499,2505 ****
    > 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>])
--- 2550,2556 ----
    > 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>])
***************
*** 2525,2530 ****
--- 2576,2583 ----
    simply be discarded.
   
    See 'help regexp syntax' for an explanation of regular expressions.
+ 
+   See also: regrab()
  & REMIT()
    remit(<object>, <message>)
  
***************
*** 2571,2577 ****
    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.
  & REVWORDS()
    revwords(<list of words>[,<delimiter>][, <output seperator>])
   
--- 2624,2630 ----
    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>])
   
***************
*** 2688,2694 ****
    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>)
--- 2741,2747 ----
    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>)
***************
*** 2710,2717 ****
    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.
!  
    Example:
      > say setdiff(foo baz gleep bar, bar moof gleep)
      You say, "baz foo"
--- 2763,2771 ----
    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"
***************
*** 2723,2729 ****
    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.
   
    Example:
      > say setinter(foo baz gleep bar, bar moof gleep)
--- 2777,2784 ----
    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)
***************
*** 2793,2799 ****
    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.
   
    Example:
      > say setunion(foo baz gleep bar, bar moof gleep)
--- 2848,2855 ----
    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)
***************
*** 2826,2836 ****
    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>)  
   
!   Returns the sine of <angle>, which should be expressed in radians.
  
!   See HELP COS() for how to convert between radians and degrees.
  & SORT()
    sort(<word1> <word2> ...[,<sort type>][,<delimiter>][,<output sep>])
    
--- 2882,2893 ----
    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>])
    
***************
*** 2885,2891 ****
    F160
  
    For details of how the algorithm works, see help soundex2
!   See also: help soundslike()
  & SOUNDEX2
    Here's how the soundex algorithm works:
    1. The first letter of the soundex code is the first letter of
--- 2942,2949 ----
    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
***************
*** 2971,2977 ****
    Example:
      > say starttime()
      You say "Sat Dec  7 00:09:13 1991
!   See also: convtime(), restarttime(), restarts().
  & RESTARTTIME()
    restarttime()
  
--- 3029,3036 ----
    Example:
      > say starttime()
      You say "Sat Dec  7 00:09:13 1991
! 
!   See also: convtime(), restarttime(), restarts()
  & RESTARTTIME()
    restarttime()
  
***************
*** 3003,3009 ****
    1 - 2 - 3
    4 - 5 -
  
! See also: map(), iter()
  & STDDEV()
    stddev(<number>,...)
  
--- 3062,3068 ----
    1 - 2 - 3
    4 - 5 -
  
!   See also: map(), iter()
  & STDDEV()
    stddev(<number>,...)
  
***************
*** 3084,3090 ****
    <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)
--- 3143,3149 ----
    <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)
***************
*** 3121,3127 ****
    \ when the argument is evaluated, and then that single \ will stop
    the greater/less than check).
  
! See also: HELP WILDCARDS
  & T()
    t(<expression>)
  
--- 3180,3186 ----
    \ when the argument is evaluated, and then that single \ will stop
    the greater/less than check).
  
!   See also: HELP WILDCARDS
  & T()
    t(<expression>)
  
***************
*** 3150,3160 ****
    brown     |fox
      
  & TAN()
!   tan(<angle>)
   
!   Returns the tangent of <angle>, which should be expressed in radians.
  
!   See HELP COS() for how to convert between radians and degrees.
  & TEL()
    tel(<object>,<destination>)
  
--- 3209,3220 ----
    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>)
  
***************
*** 3191,3197 ****
    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>])
  
--- 3251,3257 ----
    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>])
  
***************
*** 3379,3385 ****
      > say udefault(me/Test,-- BOOM --,ACK)
      You say "-- BOOM --"
   
!   See also:  get(), eval(), ufun(), uldefault(), default(), edefault().
  & ULDEFAULT()
    uldefault([<obj>/]<attr>,<default case>[,<arg>]...)
  
--- 3439,3445 ----
      > say udefault(me/Test,-- BOOM --,ACK)
      You say "-- BOOM --"
   
!   See also: get(), eval(), ufun(), uldefault(), default(), edefault()
  & ULDEFAULT()
    uldefault([<obj>/]<attr>,<default case>[,<arg>]...)
  
***************
*** 3426,3432 ****
    %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
--- 3486,3492 ----
    %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
***************
*** 3445,3451 ****
         v(!) is equivalent to %!
         v(3) is equivalent to %3
  
! See also: SUBSTITUTIONS, get(), ATTRIBUTES
  
  & VADD()
    vadd(<vector>,<vector>[,<delimiter>])
--- 3505,3511 ----
         v(!) is equivalent to %!
         v(3) is equivalent to %3
  
!   See also: SUBSTITUTIONS, get(), ATTRIBUTES
  
  & VADD()
    vadd(<vector>,<vector>[,<delimiter>])
***************
*** 3658,3661 ****
    which defines the zone.  If the second argument is specified, the
    function tries to change the zone on the object.
  
! See also: ZONES
--- 3718,3721 ----
    which defines the zone.  If the second argument is specified, the
    function tries to change the zone on the object.
  
!   See also: ZONES
*** 1_7_5.225/game/txt/hlp/penncmd.hlp Sat, 20 Jul 2002 12:05:38 -0500 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.2 600)
--- 1_7_5.312(w)/game/txt/hlp/penncmd.hlp Sun, 15 Sep 2002 15:50:16 -0500 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.5 600)
***************
*** 22,30 ****
  @<whatever> version is listed below, but help is available for each:
   
    @death         @describe      @drop          @efail         @enter
!   @failure       @follow        @idescribe     @leave         @lfail
!   @move          @payment       @success       @tport         @ufail
!   @unfollow      @use           @zenter        @zleave
  
  These '@' command set other standard attributes on objects that don't
  follow the pattern above:
--- 22,31 ----
  @<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:
***************
*** 518,523 ****
--- 519,527 ----
    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.
***************
*** 2522,2528 ****
      @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
--- 2526,2532 ----
      @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
***************
*** 3463,3469 ****
      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 page-lock.
  
    Examples:
      > page airwolf=hi there!
--- 3467,3473 ----
      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!
*** 1_7_5.225/game/txt/hlp/pennchat.hlp Tue, 02 Apr 2002 08:20:43 -0600 dunemush (pennmush/19_pennchat.h 1.2.1.4.1.3 600)
--- 1_7_5.312(w)/game/txt/hlp/pennchat.hlp Sun, 15 Sep 2002 15:52:48 -0500 dunemush (pennmush/19_pennchat.h 1.2.1.4.1.4 600)
***************
*** 92,104 ****
    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.
  
    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. 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.
  
    See "help @channel4" for more.
  & @channel4
--- 92,109 ----
    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
*** 1_7_5.225/game/txt/hlp/index.hlp Wed, 15 May 2002 20:41:03 -0500 dunemush (pennmush/20_index.hlp 1.1.1.1.1.1.1.1.1.2.1.1.2.2.2.2 660)
--- 1_7_5.312(w)/game/txt/hlp/index.hlp Thu, 29 Aug 2002 23:06:56 -0500 dunemush (pennmush/20_index.hlp 1.1.1.1.1.1.1.1.1.2.1.1.2.2.2.2.1.1 660)
***************
*** 2,177 ****
  & Entries
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   "                         $-commands                $-commands2              
!  +                         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                   1.6.5p2                  
!  1.6.5p3                   1.6.5p4                   1.6.6p0                  
  
  For more, see Entries-2
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  & Entries-2
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
!  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                   1.7.2p8                  
!  1.7.2p9                   1.7.2p10                  1.7.2p11                 
  
  For more, see Entries-3
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  & Entries-3
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
!  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                   1.7.4p5                  
!  1.7.4p6                   1.7.4p7                   1.7.4p8                  
  
  For more, see Entries-4
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  & Entries-4
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
!  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.5p0                  
!  1.7.5p1                   1.7.5p2                   1.7.5p3                  
!  1.7.5p4                   1.7.5p5                   1.7.5p6                  
!  1.7.5p7                   :                         ;                        
!  @-attributes              @-building                @-general                
!  @-wizard                  @@                        @@()                     
!  @aahear                   @aclone                   @aconnect                
!  @adeath                   @adescribe                @adestroy                
!  @adisconnect              @adrop                    @aefail                  
!  @aenter                   @afailure                 @afollow                 
!  @agive                    @ahear                    @aidescribe              
!  @aleave                   @alfail                   @alias                   
!  @allhalt                  @allquota                 @amhear                  
  
  For more, see Entries-5
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  & Entries-5
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
!  @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              @config cmds              @config cosmetic         
!  @config cosmetic2         @config costs             @config db               
!  @config dump              @config funcs             @config limits           
!  @config limits2           @config log               @config net              
  
  For more, see Entries-6
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  & Entries-6
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
!  @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                @follow                   @force                   
!  @force2                   @forwardlist              @function                
!  @function2                @function3                @function4               
!  @gedit                    @give                     @grep2                   
  
  For more, see Entries-7
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  & Entries-7
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
!  @grep                     @halt                     @haven                   
!  @hide                     @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                  @malias4                 
!  @malias5                  @map                      @motd                    
!  @move                     @mvattr                   @name                    
!  @nameaccent               @nameformat               @newpassword             
!  @notify                   @nuke                     @odeath                  
  
  For more, see Entries-8
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  & Entries-8
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
!  @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                     @power                    @prefix                  
!  @ps                       @purge                    @quota                   
!  @readcache                @receive                  @recycle                 
!  @rejectmotd               @remit                    @restart                 
!  @runout                   @rwall                    @rwallemit               
  
  For more, see Entries-9
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  & Entries-9
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
!  @rwallpose                @scan                     @search                  
!  @search2                  @search3                  @select                  
!  @set