[PENNMUSH-ANNOUNCE] 1.7.4-patch20

dunemush@pennmush.org dunemush at pennmush.org
Thu, 19 Sep 2002 21:51:11 -0500


This is patch20 to PennMUSH 1.7.4. After applying this patch, you will
have version 1.7.4p20

To apply this patch, save it to a file in your top-level MUSH directory,
and do the following:
	patch -p1 < 1.7.4-patch20
	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:

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


Prereq: 1.7.4p19
*** 1_7_4.302/Patchlevel Fri, 14 Jun 2002 18:26:41 -0500 dunemush (pennmush/5_Patchlevel 1.37 600)
--- 1_7_4.315(w)/Patchlevel Thu, 19 Sep 2002 12:24:38 -0500 dunemush (pennmush/5_Patchlevel 1.37 600)
***************
*** 1,2 ****
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.4p19
--- 1,2 ----
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.4p20
*** 1_7_4.302/CHANGES Wed, 19 Jun 2002 21:47:23 -0500 dunemush (pennmush/8_CHANGES 1.219.1.72.1.65 600)
--- 1_7_4.315(w)/CHANGES Thu, 19 Sep 2002 12:24:35 -0500 dunemush (pennmush/8_CHANGES 1.219.1.72.1.77 600)
***************
*** 18,23 ****
--- 18,51 ----
  
  ==========================================================================
  
+ 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
  
  Minor changes:
*** 1_7_4.302/game/txt/hlp/pennvers.hlp Wed, 19 Jun 2002 21:47:23 -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.1 600)
--- 1_7_4.315(w)/game/txt/hlp/pennvers.hlp Thu, 19 Sep 2002 12:24:53 -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.1 600)
***************
*** 1,5 ****
  & changes
! & 1.7.4p19
  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.4p20
  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,16 ****
--- 11,45 ----
  A list of the patchlevels associated with each release can
  be read in 'help patchlevels'.
  
+ Version 1.7.4 patchlevel 20		       September 19, 2002
+ 
+ Fixes:
+   * Help semaphores4 typo fixed by Mike Griffiths.
+   * Help cleanup. [TAP]
+   * See_All players now see hidden connected mail senders. Suggested
+     by Philip Mak.
+   * spellnum could introduce spurious spaces. Reported by Intrevis@M*U*S*H.
+   * table() sometimes produced spurious blank rows. Reported by
+     Nymeria@M*U*S*H. This is the first attempt at a fix.
+   * switch() help improved. [SW]
+   * enter <exit> no longer returns Permission denied, but 
+     "I can't see that here", as you can only enter things. 
+     Suggested by Philip Mak.
+   * A one-time, one-pointer memory leak in plyrlist.c fixed
+     by Vadiv@M*U*S*H.
+   * Unbalanced or empty double-quotes gave weird results in page 
+     and whisper. Reported by Vadiv@M*U*S*H. [SW]
+   * @chan/decomp no longer shows names of channels that the enactor
+     can't see. Reported by Nat@SW:ANT.
+   * The lock() and elock() functions now operate properly with
+     user:whatever locks. Reported by Mike Griffiths.
+   * pmatch() will locate hidden players if they're visible to you
+     because they're nearby. Suggested by Julian@M*U*S*H.
+   * regedit and other functions that used $-substitutions for subpatterns
+     could produce weird results in some cases. Reported by Bellemore@M*U*S*H
+ 
+ 
+ & 1.7.4p19
  Version 1.7.4 patchlevel 19		       June 14, 2002
  
  Minor changes:
***************
*** 5130,5136 ****
  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.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
  1.7.3: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
  1.7.2: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
         19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
--- 5159,5166 ----
  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.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
!        19, 20
  1.7.3: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
  1.7.2: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
         19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
*** 1_7_4.302/game/txt/hlp/penntop.hlp Sat, 06 Apr 2002 22:58:32 -0600 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1 600)
--- 1_7_4.315(w)/game/txt/hlp/penntop.hlp Mon, 08 Jul 2002 21:09:32 -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.1 600)
***************
*** 1344,1350 ****
    SEMAPHORE of -1, to enclose commands in an @wait, and to
    conclude the set of commands with an @notify me:
  
!   > &doit obj = $doit: @wait me={&doer = %N; @tr me/report}
    > &report obj = "[v(doer)] did it!; @notify me
    > @startup obj = @drain me; @notify me
    > @notify obj
--- 1344,1350 ----
    SEMAPHORE of -1, to enclose commands in an @wait, and to
    conclude the set of commands with an @notify me:
  
!   > &doit obj = $doit: @wait me={&doer me = %N; @tr me/report}
    > &report obj = "[v(doer)] did it!; @notify me
    > @startup obj = @drain me; @notify me
    > @notify obj
*** 1_7_4.302/game/txt/hlp/pennfunc.hlp Fri, 14 Jun 2002 18:26:41 -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 600)
--- 1_7_4.315(w)/game/txt/hlp/pennfunc.hlp Thu, 19 Sep 2002 12:24:08 -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 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
***************
*** 66,72 ****
    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.
--- 66,72 ----
    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.
***************
*** 91,97 ****
    gte()         lt()          lte()         nand()        neq()
    nor()         not()         or()          t()           xor()
      
! See also: BOOLEAN VALUES, @config
  & Dbref functions
    Dbref functions return a dbref or list of dbrefs related to some value
    on an object.
--- 91,97 ----
    gte()         lt()          lte()         nand()        neq()
    nor()         not()         or()          t()           xor()
      
!   See also: BOOLEAN VALUES, @config
  & Dbref functions
    Dbref functions return a dbref or list of dbrefs related to some value
    on an object.
***************
*** 102,108 ****
    pmatch()      rloc()        rnum()        room()        where()       
    zone()
    
! See also: DBREF
  & Information functions
    Information functions return values related to objects or channels.
   
--- 102,108 ----
    pmatch()      rloc()        rnum()        room()        where()       
    zone()
    
!   See also: DBREF
  & Information functions
    Information functions return values related to objects or channels.
   
***************
*** 148,154 ****
    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).
--- 148,154 ----
    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).
***************
*** 195,201 ****
    spellnum()    squish()      strcat()      strinsert()   stripansi()
    strlen()      switch()      trim()        ucstr()       wrap()
   
! See also: STRINGS
  & Time functions
    These functions return times or format times.
    
--- 195,201 ----
    spellnum()    squish()      strcat()      strinsert()   stripansi()
    strlen()      switch()      trim()        ucstr()       wrap()
   
!   See also: STRINGS
  & Time functions
    These functions return times or format times.
    
***************
*** 280,286 ****
    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>)
  
--- 280,286 ----
    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>)
  
***************
*** 319,325 ****
   
    For example, "ansi(fc, Test)" would hilight "Test" in flashing cyan.
   
! See also: ANSI, COLOR, FORCE_WHITE
  & APOSS()
    aposs(<object>)
  
--- 319,325 ----
   
    For example, "ansi(fc, Test)" would hilight "Test" in flashing cyan.
   
!   See also: ANSI, COLOR, FORCE_WHITE
  & APOSS()
    aposs(<object>)
  
***************
*** 493,499 ****
    If no locktype is given, "JOIN" is assumed.
    With two arguments, sets the lock.
  
!   See also @clock
  & CLONE()
    clone(<object>)
   
--- 493,499 ----
    If no locktype is given, "JOIN" is assumed.
    With two arguments, sets the lock.
  
!   See also: @clock
  & CLONE()
    clone(<object>)
   
***************
*** 517,523 ****
    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>)
--- 517,523 ----
    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>)
***************
*** 536,542 ****
    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>)
    
--- 536,542 ----
    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>)
    
***************
*** 546,552 ****
    object). You must control <object> or <victim>, or have the See_All
    power, to use this function.
  
! See also: CONTROL
    
  & CONVSECS()
  & CONVUTCSECS()
--- 546,552 ----
    object). You must control <object> or <victim>, or have the See_All
    power, to use this function.
  
!   See also: CONTROL
    
  & CONVSECS()
  & CONVUTCSECS()
***************
*** 568,574 ****
    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>)
  
--- 568,574 ----
    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>)
  
***************
*** 590,596 ****
    > say [convtime(Wed Jun 24 10:22:54 1992)]
    You say, "709395774"
  
! See also: convsecs(), time()
  & COS()
    cos(<angle>)
   
--- 590,596 ----
    > say [convtime(Wed Jun 24 10:22:54 1992)]
    You say, "709395774"
  
!   See also: convsecs(), time()
  & COS()
    cos(<angle>)
   
***************
*** 677,683 ****
      > say default(me/Test, No fruits!)
      You say "No fruits!"
   
!   See also:  get(), eval(), ufun(), edefault(), udefault(), uldefault().
   
  & DELETE()
    delete(<string>, <first>, <len>)
--- 677,683 ----
      > say default(me/Test, No fruits!)
      You say "No fruits!"
   
!   See also: get(), eval(), ufun(), edefault(), udefault(), uldefault()
   
  & DELETE()
    delete(<string>, <first>, <len>)
***************
*** 747,760 ****
    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()
   
--- 747,760 ----
    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()
   
***************
*** 776,782 ****
      > 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> ...])
--- 776,782 ----
      > 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> ...])
***************
*** 799,805 ****
  
    edit() can not replace a literal single ^ or $. Use regedit() for that.
    
!   See also @edit, regedit().
  & ELEMENT()
    element(<list>,<item>,<single-character separator>)
    
--- 799,805 ----
  
    edit() can not replace a literal single ^ or $. Use regedit() for that.
    
!   See also: @edit, regedit()
  & ELEMENT()
    element(<list>,<item>,<single-character separator>)
    
***************
*** 811,816 ****
--- 811,818 ----
    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>])
   
***************
*** 824,829 ****
--- 826,832 ----
      > say elements(Foof|Ack|Beep|Moo,3 1,|)
      You say "Beep|Foof"
  
+   See also: extract(), index(), grab()
  & ELOCK()
    elock(<object>[/<locktype>], <victim>)
  
***************
*** 839,845 ****
        think elock(Dancing Slippers/drop, Princess)
        > 0
    
! See also: @lock, locktypes
  & EMIT()
    emit(<message>)
  
--- 842,848 ----
        think elock(Dancing Slippers/drop, Princess)
        > 0
    
!   See also: @lock, locktypes
  & EMIT()
    emit(<message>)
  
***************
*** 876,882 ****
    Takes two integers, and returns 1 if they are equal, 0 otherwise.
    Will not work with characters.
    
! See also: neq(), match()
  & ESCAPE()
    escape(<string>)
   
--- 879,885 ----
    Takes two integers, and returns 1 if they are equal, 0 otherwise.
    Will not work with characters.
    
!   See also: neq(), match()
  & ESCAPE()
    escape(<string>)
   
***************
*** 915,921 ****
    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>)
  
--- 918,924 ----
    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>)
  
***************
*** 927,933 ****
    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>)
   
--- 930,936 ----
    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>)
   
***************
*** 946,952 ****
      think extract(This is a test string,3,2)
      > a test
  
! See also: index()
  & FDIV()
    fdiv(<numerator>,<denominator>)
   
--- 949,955 ----
      think extract(This is a test string,3,2)
      > a test
  
!   See also: index(), elements(), grab()
  & FDIV()
    fdiv(<numerator>,<denominator>)
   
***************
*** 1136,1142 ****
    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()
--- 1139,1146 ----
    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()
***************
*** 1158,1164 ****
    > say regraball(This is testing a test,s$)
    You say "This is"
    
!   See also: match(), matchall(), grab(), regmatch().
  & GREP()
  & REGREP()
    grep(<object>,<attrs>,<pattern>)
--- 1162,1168 ----
    > say regraball(This is testing a test,s$)
    You say "This is"
    
!   See also: match(), matchall(), grab(), regmatch()
  & GREP()
  & REGREP()
    grep(<object>,<attrs>,<pattern>)
***************
*** 1277,1283 ****
    if the <condition> is true, or <false expression> (if provided) if the
    <condition> is false.
  
! See also:  BOOLEAN VALUES, switch()
  & INC()
    inc(<integer>)
    inc(<string-ending-in-integer>)
--- 1281,1287 ----
    if the <condition> is true, or <false expression> (if provided) if the
    <condition> is false.
  
!   See also:  BOOLEAN VALUES, switch()
  & INC()
    inc(<integer>)
    inc(<string-ending-in-integer>)
***************
*** 1315,1321 ****
      You say, "
      blue tribble^
      cute doll"
!   
  & INSERT()
    insert(<list>,<position>,<new item>[,<single-character separator>])
    
--- 1319,1326 ----
      You say, "
      blue tribble^
      cute doll"
! 
!   See also: extract(), elements(), grab()
  & INSERT()
    insert(<list>,<position>,<new item>[,<single-character separator>])
    
***************
*** 1340,1353 ****
    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>)
  
--- 1345,1358 ----
    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>)
  
***************
*** 1356,1362 ****
    the characters in the string must be digits, and an optional decimal
    point.
  
! See also: isint()
  & ISWORD()
    isword(<string>)
    
--- 1361,1367 ----
    the characters in the string must be digits, and an optional decimal
    point.
  
!   See also: isint()
  & ISWORD()
    isword(<string>)
    
***************
*** 1515,1521 ****
    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>)
  
--- 1520,1526 ----
    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>)
  
***************
*** 1553,1559 ****
    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()
  & LJUST()
    ljust(<string>,<length>[,<fill>])
    
--- 1558,1564 ----
    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()
  & LJUST()
    ljust(<string>,<length>[,<fill>])
    
***************
*** 1662,1668 ****
    > 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>)
   
--- 1667,1673 ----
    > 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>)
   
***************
*** 1800,1806 ****
    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>)
--- 1805,1811 ----
    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>)
***************
*** 1889,1894 ****
--- 1894,1901 ----
    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>])
   
***************
*** 1904,1910 ****
    > say matchall(This is testing a test,tes*)
    You say "3 5"
   
!   See also: match(), strmatch(). 
  & MAX()
    max(<num1>, <num2>, ..., ...)
  
--- 1911,1917 ----
    > say matchall(This is testing a test,tes*)
    You say "3 5"
   
!   See also: match(), strmatch(), graball()
  & MAX()
    max(<num1>, <num2>, ..., ...)
  
***************
*** 2001,2007 ****
  
    Mod and modulus are just aliases for modulo.
  
!   See also DIV.
  & MONEY()
    money(<object>)
    money(<integer>)
--- 2008,2014 ----
  
    Mod and modulus are just aliases for modulo.
  
!   See also: DIV
  & MONEY()
    money(<object>)
    money(<integer>)
***************
*** 2058,2064 ****
    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
--- 2065,2071 ----
    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
***************
*** 2071,2077 ****
    > 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 
--- 2078,2084 ----
    > 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 
***************
*** 2117,2123 ****
    [neq(<integer1>,<integer2>)]
  
    Basically the same as [not(eq(<integer1>,<integer2>))].
!   (see eq(), not())
  & NEXT()
    next(<object>)
  
--- 2124,2131 ----
    [neq(<integer1>,<integer2>)]
  
    Basically the same as [not(eq(<integer1>,<integer2>))].
! 
!   See also: eq(), not()
  & NEXT()
    next(<object>)
  
***************
*** 2135,2141 ****
    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>,...)
  
--- 2143,2149 ----
    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>,...)
  
***************
*** 2181,2187 ****
    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>)
--- 2189,2195 ----
    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>)
***************
*** 2206,2212 ****
    (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>)
    
--- 2214,2220 ----
    (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>)
    
***************
*** 2250,2268 ****
    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()
--- 2258,2276 ----
    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()
***************
*** 2349,2355 ****
    > 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>])
--- 2357,2363 ----
    > 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>])
***************
*** 2375,2380 ****
--- 2383,2390 ----
    simply be discarded.
   
    See 'help regexp syntax' for an explanation of regular expressions.
+ 
+   See also: regrab()
  & REMIT()
    remit(<object>, <message>)
  
***************
*** 2538,2544 ****
    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>)
--- 2548,2554 ----
    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>)
***************
*** 2735,2741 ****
    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
--- 2745,2752 ----
    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
***************
*** 2821,2827 ****
    Example:
      > say starttime()
      You say "Sat Dec  7 00:09:13 1991
!   See also: convtime(), restarttime(), restarts().
  & RESTARTTIME()
    restarttime()
  
--- 2832,2839 ----
    Example:
      > say starttime()
      You say "Sat Dec  7 00:09:13 1991
! 
!   See also: convtime(), restarttime(), restarts()
  & RESTARTTIME()
    restarttime()
  
***************
*** 2853,2859 ****
    1 - 2 - 3
    4 - 5 -
  
! See also: map(), iter()
  & STDDEV()
    stddev(<number>,...)
  
--- 2865,2871 ----
    1 - 2 - 3
    4 - 5 -
  
!   See also: map(), iter()
  & STDDEV()
    stddev(<number>,...)
  
***************
*** 2929,2935 ****
    <expr>ssions, without spaces between them, so they match similarly to
    @switch, while switch() and case() match more like @switch/first.
  
! See HELP SWITCH2 for examples.
  & SWITCH2
    Examples of switch() and related functions:
      > say switch(test, *a*, foo, *b*, bar, *t*, neat, baz)
--- 2941,2947 ----
    <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)
***************
*** 2942,2948 ****
      You say, "moof"
      > say case(moof, *f, foo, moof, bar, baz)
      You say, "bar"
!  
  & T()
    t(<expression>)
  
--- 2954,2984 ----
      You say, "moof"
      > say case(moof, *f, foo, moof, bar, baz)
      You say, "bar"
! & SWITCH WILDCARDS
!   @switch, @select, switch() and switchall() normally do wildcard
!   matching between their first argument and the <expr>ession
!   arguments, with the normal * and ? special characters. However, if
!   one of the <expr>essions starts with < or >, a less than or greater
!   than check is done instead of wildcard matching for that pair.
! 
!   switch(X, >Y, A, B) returns A if X is greater than Y,
!   and B if X is less than or equal to Y.
!   
!   switch(X, <Y, A, B) returns A if X is less than Y,
!   and B if X is greater than or equal to Y.
! 
!   If X and Y are numbers, the test is like using gt() or lt(). gte()
!   and lte() can be simulated by using Y'=Y-1 and Y'=Y+1.
! 
!   If X and Y are non-numeric strings, the result of comp(X,Y) is used
!   to determine which string is alphabetically before (Less than) the other.
! 
!   If you need to have a leading < or > that's treated like a normal
!   character in a wildcard match, use \\< or \\> (The \\ will turn into
!   \ when the argument is evaluated, and then that single \ will stop
!   the greater/less than check).
! 
!   See also: HELP WILDCARDS
  & T()
    t(<expression>)
  
***************
*** 2995,3001 ****
    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>])
  
--- 3031,3037 ----
    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>])
  
***************
*** 3183,3189 ****
      > say udefault(me/Test,-- BOOM --,ACK)
      You say "-- BOOM --"
   
!   See also:  get(), eval(), ufun(), uldefault(), default(), edefault().
  & ULDEFAULT()
    uldefault([<obj>/]<attr>,<default case>[,<arg>]...)
  
--- 3219,3225 ----
      > say udefault(me/Test,-- BOOM --,ACK)
      You say "-- BOOM --"
   
!   See also: get(), eval(), ufun(), uldefault(), default(), edefault()
  & ULDEFAULT()
    uldefault([<obj>/]<attr>,<default case>[,<arg>]...)
  
***************
*** 3230,3236 ****
    %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
--- 3266,3272 ----
    %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
***************
*** 3249,3255 ****
         v(!) is equivalent to %!
         v(3) is equivalent to %3
  
! See also: SUBSTITUTIONS, get(), ATTRIBUTES
  
  & VADD()
    vadd(<vector>,<vector>[,<delimiter>])
--- 3285,3291 ----
         v(!) is equivalent to %!
         v(3) is equivalent to %3
  
!   See also: SUBSTITUTIONS, get(), ATTRIBUTES
  
  & VADD()
    vadd(<vector>,<vector>[,<delimiter>])
***************
*** 3462,3465 ****
    which defines the zone.  If the second argument is specified, the
    function tries to change the zone on the object.
  
! See also: ZONES
--- 3498,3501 ----
    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_4.302/game/txt/hlp/penncmd.hlp Mon, 22 Apr 2002 11:31:46 -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 600)
--- 1_7_4.315(w)/game/txt/hlp/penncmd.hlp Sat, 20 Jul 2002 11:48:10 -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.1 600)
***************
*** 2685,2691 ****
      &SWITCH_EX thing = $test:@switch hasflag(%#,PUPPET)=1,"Puppet!,"Not Puppet!
      test
      > thing says, "Not Puppet!"
! See also: @select, switch()
  & @teleport
    @teleport[/silent] [<object>=] <room>. 
  
--- 2685,2691 ----
      &SWITCH_EX thing = $test:@switch hasflag(%#,PUPPET)=1,"Puppet!,"Not Puppet!
      test
      > thing says, "Not Puppet!"
! See also: switch wildcards, @select, switch()
  & @teleport
    @teleport[/silent] [<object>=] <room>. 
  
*** 1_7_4.302/src/strutil.c Mon, 15 Apr 2002 21:33:03 -0500 dunemush (pennmush/b/33_strutil.c 1.28.1.3.1.3.1.7.2.1.1.2.1.1.1.1.1.1 660)
--- 1_7_4.315(w)/src/strutil.c Thu, 19 Sep 2002 12:25:35 -0500 dunemush (pennmush/b/33_strutil.c 1.28.1.3.1.3.1.7.2.1.1.2.1.1.1.1.1.1.1.1 660)
***************
*** 773,779 ****
    while (**head == ' ')
      (*head)++;
  
!   while (**head == '"') {
      (*head)++;
      paren = 1;
    }
--- 773,779 ----
    while (**head == ' ')
      (*head)++;
  
!   if (**head == '"') {
      (*head)++;
      paren = 1;
    }
***************
*** 786,795 ****
      (*head)++;
    }
  
!   if (paren)
      (*head)++;
  
!   safe_chr(0, buf, &p);
    return buf;
  
  }
--- 786,795 ----
      (*head)++;
    }
  
!   if (paren && **head)
      (*head)++;
  
!   safe_chr('\0', buf, &p);
    return buf;
  
  }
*** 1_7_4.302/src/plyrlist.c Fri, 17 May 2002 14:49:25 -0500 dunemush (pennmush/b/46_plyrlist.c 1.5.1.1.1.1 660)
--- 1_7_4.315(w)/src/plyrlist.c Thu, 19 Sep 2002 12:25:35 -0500 dunemush (pennmush/b/46_plyrlist.c 1.5.1.1.1.2 660)
***************
*** 37,43 ****
  void
  clear_players()
  {
!   hashflush(&htab_player_list, 256);
  }
  
  
--- 37,46 ----
  void
  clear_players()
  {
!   if (hft_initialized)
!     hashflush(&htab_player_list, 256);
!   else
!     init_hft();
  }
  
  
*** 1_7_4.302/src/parse.c Tue, 19 Mar 2002 08:38:06 -0600 dunemush (pennmush/b/48_parse.c 1.23.1.10.1.2.1.1.1.1.1.2.1.2 660)
--- 1_7_4.315(w)/src/parse.c Thu, 19 Sep 2002 12:25:35 -0500 dunemush (pennmush/b/48_parse.c 1.23.1.10.1.2.1.1.1.1.1.2.1.2.1.1 660)
***************
*** 482,488 ****
  	} else
  	  break;
  
! 	if (p > re_subpatterns || re_offsets == NULL || re_from == NULL)
  	  break;
  
  	pcre_copy_substring(re_from, re_offsets, re_subpatterns, p, obuf,
--- 482,488 ----
  	} else
  	  break;
  
! 	if (p >= re_subpatterns || re_offsets == NULL || re_from == NULL)
  	  break;
  
  	pcre_copy_substring(re_from, re_offsets, re_subpatterns, p, obuf,
*** 1_7_4.302/src/move.c Sat, 18 May 2002 14:37:30 -0500 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.9.1.1.1.1.1.2.1.1.1.1 660)
--- 1_7_4.315(w)/src/move.c Thu, 19 Sep 2002 12:25:35 -0500 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.9.1.1.1.1.1.2.1.1.1.1.1.1 660)
***************
*** 659,666 ****
  {
    dbref thing;
    dbref loc;
!   long match_flags =
!     MAT_CHECK_KEYS | MAT_NEIGHBOR | MAT_EXIT | MAT_ENGLISH | MAT_ABSOLUTE;
  
    if ((thing = noisy_match_result(player, what, TYPE_THING, match_flags))
        == NOTHING)
--- 659,665 ----
  {
    dbref thing;
    dbref loc;
!   long match_flags = MAT_CHECK_KEYS | MAT_NEIGHBOR | MAT_ENGLISH | MAT_ABSOLUTE;
  
    if ((thing = noisy_match_result(player, what, TYPE_THING, match_flags))
        == NOTHING)
*** 1_7_4.302/src/funmath.c Mon, 29 Apr 2002 12:53:14 -0500 dunemush (pennmush/c/15_funmath.c 1.39.1.1.1.1.1.1 660)
--- 1_7_4.315(w)/src/funmath.c Thu, 19 Sep 2002 12:25:34 -0500 dunemush (pennmush/c/15_funmath.c 1.39.1.1.1.1.1.1.1.1 660)
***************
*** 1119,1125 ****
  	safe_chr(' ', *buff, *bp);
        safe_str(special[x2], *buff, *bp);
        started = 1;
!     } else {
        if (started)
  	safe_chr(' ', *buff, *bp);
        if (x1) {
--- 1119,1125 ----
  	safe_chr(' ', *buff, *bp);
        safe_str(special[x2], *buff, *bp);
        started = 1;
!     } else if (x1 || x2) {
        if (started)
  	safe_chr(' ', *buff, *bp);
        if (x1) {
*** 1_7_4.302/src/funlist.c Mon, 29 Apr 2002 11:53:21 -0500 dunemush (pennmush/c/16_funlist.c 1.3.1.1.1.5.1.2.1.1.1.1.1.4.1.2.1.2.1.19.1.2.1.1.1.2.1.5.1.1.1.1.1.1.1.1.1.1.2.1.1.3.1.2.1.1.1.1.1.1.1.1 660)
--- 1_7_4.315(w)/src/funlist.c Thu, 19 Sep 2002 12:25:34 -0500 dunemush (pennmush/c/16_funlist.c 1.3.1.1.1.5.1.2.1.1.1.1.1.4.1.2.1.2.1.19.1.2.1.1.1.2.1.5.1.1.1.1.1.1.1.1.1.1.2.1.1.3.1.2.1.1.1.1.1.1.1.1.1.1.1.1 660)
***************
*** 2357,2363 ****
    while (cp) {
      col += field_width + !!osep;
      if (col > line_length) {
!       safe_str("\r\n", buff, bp);
        col = field_width + !!osep;
      } else {
        if (osep)
--- 2357,2366 ----
    while (cp) {
      col += field_width + !!osep;
      if (col > line_length) {
!       if (NEWLINE_ONE_CHAR)
! 	safe_str("\n", buff, bp);
!       else
! 	safe_str("\r\n", buff, bp);
        col = field_width + !!osep;
      } else {
        if (osep)
*** 1_7_4.302/src/fundb.c Mon, 10 Jun 2002 23:17:29 -0500 dunemush (pennmush/c/17_fundb.c 1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.7.1.3.1.3.1.3.1.2.1.2.1.3.2.1.2.1.2.1.1.1.1.4.1.1.1.1.1.1.1.1 660)
--- 1_7_4.315(w)/src/fundb.c Thu, 19 Sep 2002 12:25:34 -0500 dunemush (pennmush/c/17_fundb.c 1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.7.1.3.1.3.1.3.1.2.1.2.1.3.2.1.2.1.2.1.1.1.1.4.1.1.1.1.1.1.1.1.1.1.1.1 660)
***************
*** 40,46 ****
  char *do_get_attrib _((dbref executor, dbref thing, char *attrib));
  dbref next_con _((dbref player, dbref this));
  dbref next_exit _((dbref player, dbref this));
! static lock_type get_locktype _((const char *str));
  extern struct db_stat_info *get_stats _((dbref owner));
  static int lattr_helper _((dbref player, dbref thing, char const *pattern,
  			   ATTR *atr, void *args));
--- 40,46 ----
  char *do_get_attrib _((dbref executor, dbref thing, char *attrib));
  dbref next_con _((dbref player, dbref this));
  dbref next_exit _((dbref player, dbref this));
! static lock_type get_locktype _((char *str));
  extern struct db_stat_info *get_stats _((dbref owner));
  static int lattr_helper _((dbref player, dbref thing, char const *pattern,
  			   ATTR *atr, void *args));
***************
*** 879,891 ****
  
  static lock_type
  get_locktype(str)
!     char const *str;
  {
    /* figure out a lock type */
  
    if (!str || !*str)
      return Basic_Lock;
!   return str;
  }
  
  /* ARGSUSED */
--- 879,891 ----
  
  static lock_type
  get_locktype(str)
!     char *str;
  {
    /* figure out a lock type */
  
    if (!str || !*str)
      return Basic_Lock;
!   return upcasestr(str);
  }
  
  /* ARGSUSED */
*** 1_7_4.302/src/extmail.c Mon, 11 Mar 2002 17:59:05 -0600 dunemush (pennmush/c/22_extmail.c 1.44.1.7.1.5 660)
--- 1_7_4.315(w)/src/extmail.c Thu, 19 Sep 2002 12:25:34 -0500 dunemush (pennmush/c/22_extmail.c 1.44.1.7.1.5.1.1 660)
***************
*** 485,491 ****
  		      ("From: %-55s %s\nDate: %-25s   %s %2d   Message: %d\nStatus: %s"),
  		      tbuf1, (IsPlayer(mp->from) && Connected(mp->from)
  			      && (!hidden(mp->from)
! 				  || Hasprivs(player))) ? " (Conn)" : "      ",
  		      uncompress(mp->time), folderheader, Folder(mp),
  		      i[Folder(mp)], status_string(mp));
  #ifdef MAIL_SUBJECTS
--- 485,491 ----
  		      ("From: %-55s %s\nDate: %-25s   %s %2d   Message: %d\nStatus: %s"),
  		      tbuf1, (IsPlayer(mp->from) && Connected(mp->from)
  			      && (!hidden(mp->from)
! 				  || Priv_Who(player))) ? " (Conn)" : "      ",
  		      uncompress(mp->time), folderheader, Folder(mp),
  		      i[Folder(mp)], status_string(mp));
  #ifdef MAIL_SUBJECTS
***************
*** 557,563 ****
  	notify_format(player, "[%s] %2d:%-3d %c%-12s  %-*s %s",
  		      status_chars(mp), Folder(mp), i[Folder(mp)],
  		      ((Connected(mp->from) &&
! 			(!hidden(mp->from) || Hasprivs(player)))
  		       ? '*' : ' '),
  		      chopstr(Name(mp->from), 12),
  		      30, subj, mail_list_time(uncompress(mp->time), 1));
--- 557,563 ----
  	notify_format(player, "[%s] %2d:%-3d %c%-12s  %-*s %s",
  		      status_chars(mp), Folder(mp), i[Folder(mp)],
  		      ((Connected(mp->from) &&
! 			(!hidden(mp->from) || Priv_Who(player)))
  		       ? '*' : ' '),
  		      chopstr(Name(mp->from), 12),
  		      30, subj, mail_list_time(uncompress(mp->time), 1));
***************
*** 569,575 ****
  		      PLAYER_NAME_LIMIT + 1, Name(mp->from),
  		      mail_list_time(uncompress(mp->time), 0),
  		      ((Connected(mp->from) && (!hidden(mp->from)
! 						|| Hasprivs(player)))
  		       ? "Conn" : " "));
  #endif
  	if (SUPPORT_PUEBLO)
--- 569,575 ----
  		      PLAYER_NAME_LIMIT + 1, Name(mp->from),
  		      mail_list_time(uncompress(mp->time), 0),
  		      ((Connected(mp->from) && (!hidden(mp->from)
! 						|| Priv_Who(player)))
  		       ? "Conn" : " "));
  #endif
  	if (SUPPORT_PUEBLO)
*** 1_7_4.302/src/extchat.c Mon, 06 May 2002 16:03:56 -0500 dunemush (pennmush/c/23_extchat.c 1.1.1.1.1.1.1.1.1.2.1.1.1.3.1.1.1.5.1.1.1.1.1.5.1.2.1.3.1.3.1.1.1.4.1.2.1.6.1.2.1.1.2.4.2.9.1.2.1.2.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1 660)
--- 1_7_4.315(w)/src/extchat.c Thu, 19 Sep 2002 12:25:34 -0500 dunemush (pennmush/c/23_extchat.c 1.1.1.1.1.1.1.1.1.2.1.1.1.3.1.1.1.5.1.1.1.1.1.5.1.2.1.3.1.3.1.1.1.4.1.2.1.6.1.2.1.1.2.4.2.9.1.2.1.2.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1 660)
***************
*** 2020,2027 ****
        found++;
        if (!(See_All(player) || Chan_Can_Modify(c, player)
  	    || (ChanCreator(c) == player))) {
! 	notify_format(player, T("CHAT: No permission to decompile <%s>"),
! 		      ChanName(c));
  	continue;
        }
        notify_format(player, "@channel/add %s = %s", ChanName(c),
--- 2020,2028 ----
        found++;
        if (!(See_All(player) || Chan_Can_Modify(c, player)
  	    || (ChanCreator(c) == player))) {
! 	if (Chan_Can_See(c, player))
! 	  notify_format(player, T("CHAT: No permission to decompile <%s>"),
! 			ChanName(c));
  	continue;
        }
        notify_format(player, "@channel/add %s = %s", ChanName(c),
*** 1_7_4.302/src/bsd.c Mon, 06 May 2002 16:03:56 -0500 dunemush (pennmush/c/38_bsd.c 1.58.1.11.1.2.1.5.1.7.1.14.1.13.1.9.1.4.1.2.1.12.1.1.1.1.1.2.1.1.1.13.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 660)
--- 1_7_4.315(w)/src/bsd.c Thu, 19 Sep 2002 12:25:33 -0500 dunemush (pennmush/c/38_bsd.c 1.58.1.11.1.2.1.5.1.7.1.14.1.13.1.9.1.4.1.2.1.12.1.1.1.1.1.2.1.1.1.13.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.1.1 660)
***************
*** 4654,4660 ****
    target = short_page(match);
    if (Priv_Who(player) || !GoodObject(target))
      return target;
!   if (hidden(target))
      return NOTHING;
    return target;
  }
--- 4654,4660 ----
    target = short_page(match);
    if (Priv_Who(player) || !GoodObject(target))
      return target;
!   if (Dark(target) || (hidden(target) && !nearby(player, target)))
      return NOTHING;
    return target;
  }
*** 1_7_4.302/hdrs/version.h Fri, 14 Jun 2002 18:26:41 -0500 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.1.1.8 660)
--- 1_7_4.315(w)/hdrs/version.h Thu, 19 Sep 2002 12:25:39 -0500 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.1.1.8 660)
***************
*** 1,2 ****
! #define VERSION "PennMUSH version 1.7.4 patchlevel 19 [06/14/2002]"
! #define SHORTVN "PennMUSH 1.7.4p19"
--- 1,2 ----
! #define VERSION "PennMUSH version 1.7.4 patchlevel 20 [09/19/2002]"
! #define SHORTVN "PennMUSH 1.7.4p20"