[PENNMUSH-ANNOUNCE] 1.7.4-patch07

dunemush@pennmush.org dunemush at pennmush.org
Tue, 10 Jul 2001 14:28:53 -0500


This is patch07 to PennMUSH 1.7.4. After applying this patch, you will
have version 1.7.4p7

To apply this patch, save it to a file in your top-level MUSH directory,
and do the following:
	patch -p1 < 1.7.4-patch07
	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:
  * %r can now evaluate to one character or two, based on a new config 
    option, newline_one_char, which defaults to being yes. This allows
    %r to be used as a list delimiter. However, this may
    break softcode which expects strlen(%r) to be 2, but it's probably
    smarter to fix the softcode than turn off this option. [sw]
  * If a command and a standard attribute have the same name, the
    command takes precedence. So if you have an @attribute named
    "PEMIT", @pemit me=foo will do the command, not set the attribute. [SW]
Minor changes:
  * When someone attempts to create too many attributes on an object,
    the log indicates who and which object. Suggested by Frob@Battlestar
    Galactica:TSC.
  * Buncha tprintfs replaced with notify_formats. [SW] 
  * New local_connect() and local_disconnect() hooks in local.dst.
    Suggested by Eratl@M*U*S*H.
  * lookup_player now deals with player names prefixed with "*",
    so a bunch of commands like @newpassword will now treat those
    arguments. Suggested by Glonk@GlonkMUSH.
  * Make is more verbose about alerting you to changes in the 
    src/*.dst files.
  * The message for undestroying someone else's object more closely matches
    the destroy message. Suggested by Noltar@Korongil.
  * Server output that used to be tagged with "PRE" for Pueblo is now
    tagged with "SAMP", because the original Pueblo client did not correctly
    handle "<BR>\n" in PRE, and the newer clients that are supporting
    the pueblo protocol, like MUSHclient, do handle it correctly, causing
    an incompatibility problem. Our workaround is to avoid PRE. 
    Reported by [NJG].
  * The WHO list output is tagged <img xch_cmd=html> for Pueblo to get
    appropriate newline handling. [NJG]
  * help @mail mentions help @malias. Suggested by Trispis@M*U*S*H.
  * Matching code now treats players you can't see like disconnected players
    when matching *player. Reported by Walker@M*U*S*H.
  * @newpassword now confirms whose password was changed. Suggested by
    Xyrxwyrth@M*U*S*H.
  * @chan/who and cwho() now include objects on the channel. Suggested by
    Glonk@GlonkMUSH.
  * q-register lookup is slightly faster. [SW]
  * Floating-point numbers in exponential format (6.02e23) are always
    accepted, not just when tiny_math is set. [SW]
  * isint() and isnum() ignore the null_eq_zero option, since they already
    ignore tiny_math. [SW]
  * time() and convsecs() take an optional timezone argument that,
    if 'UTC', makes them act the same way as utctime() and convutcsecs(). 
    From MUX2. [SW]
Fixes:
  * Additional range checking to avoid some bugs reported by Alierak. [SW]
  * Fix to buglet in @name error with PLAYER_NAME_SPACES reported by
    Luke@M*U*S*H.
  * Typo in @name error message fixed by Luke@M*U*S*H.
  * One could @pcreate players past the hard db limit. Reported by Z@Korongil.
  * Typos in config_h.SH and options.h.dist fixed by Oriens@Alexandria.
  * Under some conditions, you could double-join a channel.
    Reported by Xyrxwyrth@M*U*S*H, investigated by Steven@Champions.
  * Error message for @chan/desc improved. Reported by Oriens@Alexandria.
  * Typo in alias.cnf fixed by rodregis@M*U*S*H.
  * @mvattr sometimes failed to remove the old attrib, when it was a 
    standard attrib that could be abbreviated (@mvattr a/desc=b).
    Fixed by Walker@M*U*S*H.
  * Some english-matching (like 'get 1st foo') would fail. Reported by
    Mystery8.
  * Typo in help @verb reported by Greck.
  * MacOS tweaks. [DW]
  * Better detection of numbers that are too big. [SW]
  * Wizards could crash the server by entering objects in their own
    inventory. Reported by Howie@New Frontiers.

Prereq: 1.7.4p6
*** 1_7_4.101/Patchlevel Thu, 31 May 2001 15:33:03 -0500 dunemush (pennmush/5_Patchlevel 1.24 600)
--- 1_7_4.129(w)/Patchlevel Mon, 02 Jul 2001 10:20:22 -0500 dunemush (pennmush/5_Patchlevel 1.25 600)
***************
*** 1,2 ****
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.4p6
--- 1,2 ----
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.4p7
*** 1_7_4.101/README Mon, 12 Mar 2001 14:44:39 -0600 dunemush (pennmush/4_README 1.7 600)
--- 1_7_4.129(w)/README Thu, 14 Jun 2001 18:21:54 -0500 dunemush (pennmush/4_README 1.8 600)
***************
*** 523,528 ****
--- 523,529 ----
  	SGI Indy Irix 5.x and 6.x
  	HP 9000 series HP-UX 8.x
  	IBM RS/6000 AIX 3.2
+ 	IBM S/390 Linux
  	Novell Unixware SVR4
  	Linux
  	FreeBSD
*** 1_7_4.101/CHANGES Mon, 11 Jun 2001 10:50:03 -0500 dunemush (pennmush/8_CHANGES 1.216 600)
--- 1_7_4.129(w)/CHANGES Tue, 10 Jul 2001 14:23:12 -0500 dunemush (pennmush/8_CHANGES 1.219.1.16 600)
***************
*** 7,13 ****
  [TN] is Thorvald Natvig, a PennMUSH developer (aka Trivian)
  [TAP] is T. Alexander Popiel, a PennMUSH developer (aka Talek)
  [SW] is Shawn Wagner, a PennMUSH developer (aka Raevnos)
! [LdW] is Luuk de Waard, a PennMUSH developer (aka Halatir)
  [RLM] is Ralph Melton, a former PennMUSH developer
  [NJG] is Nick Gammon, the Win32 porter
  [DW] is Dan Williams, the MacOS porter
--- 7,13 ----
  [TN] is Thorvald Natvig, a PennMUSH developer (aka Trivian)
  [TAP] is T. Alexander Popiel, a PennMUSH developer (aka Talek)
  [SW] is Shawn Wagner, a PennMUSH developer (aka Raevnos)
! [LdW] is Luuk de Waard, a former PennMUSH developer (aka Halatir)
  [RLM] is Ralph Melton, a former PennMUSH developer
  [NJG] is Nick Gammon, the Win32 porter
  [DW] is Dan Williams, the MacOS porter
***************
*** 17,22 ****
--- 17,92 ----
  
  ==========================================================================
  
+ Version 1.7.4 patchlevel 7		       July 02, 2001
+ 
+ Major changes:
+   * %r can now evaluate to one character or two, based on a new config 
+     option, newline_one_char, which defaults to being yes. This allows
+     %r to be used as a list delimiter. However, this may
+     break softcode which expects strlen(%r) to be 2, but it's probably
+     smarter to fix the softcode than turn off this option. [sw]
+   * If a command and a standard attribute have the same name, the
+     command takes precedence. So if you have an @attribute named
+     "PEMIT", @pemit me=foo will do the command, not set the attribute. [SW]
+ Minor changes:
+   * When someone attempts to create too many attributes on an object,
+     the log indicates who and which object. Suggested by Frob@Battlestar
+     Galactica:TSC.
+   * Buncha tprintfs replaced with notify_formats. [SW] 
+   * New local_connect() and local_disconnect() hooks in local.dst.
+     Suggested by Eratl@M*U*S*H.
+   * lookup_player now deals with player names prefixed with "*",
+     so a bunch of commands like @newpassword will now treat those
+     arguments. Suggested by Glonk@GlonkMUSH.
+   * Make is more verbose about alerting you to changes in the 
+     src/*.dst files.
+   * The message for undestroying someone else's object more closely matches
+     the destroy message. Suggested by Noltar@Korongil.
+   * Server output that used to be tagged with "PRE" for Pueblo is now
+     tagged with "SAMP", because the original Pueblo client did not correctly
+     handle "<BR>\n" in PRE, and the newer clients that are supporting
+     the pueblo protocol, like MUSHclient, do handle it correctly, causing
+     an incompatibility problem. Our workaround is to avoid PRE. 
+     Reported by [NJG].
+   * The WHO list output is tagged <img xch_cmd=html> for Pueblo to get
+     appropriate newline handling. [NJG]
+   * help @mail mentions help @malias. Suggested by Trispis@M*U*S*H.
+   * Matching code now treats players you can't see like disconnected players
+     when matching *player. Reported by Walker@M*U*S*H.
+   * @newpassword now confirms whose password was changed. Suggested by
+     Xyrxwyrth@M*U*S*H.
+   * @chan/who and cwho() now include objects on the channel. Suggested by
+     Glonk@GlonkMUSH.
+   * q-register lookup is slightly faster. [SW]
+   * Floating-point numbers in exponential format (6.02e23) are always
+     accepted, not just when tiny_math is set. [SW]
+   * isint() and isnum() ignore the null_eq_zero option, since they already
+     ignore tiny_math. [SW]
+   * time() and convsecs() take an optional timezone argument that,
+     if 'UTC', makes them act the same way as utctime() and convutcsecs(). 
+     From MUX2. [SW]
+ Fixes:
+   * Additional range checking to avoid some bugs reported by Alierak. [SW]
+   * Fix to buglet in @name error with PLAYER_NAME_SPACES reported by
+     Luke@M*U*S*H.
+   * Typo in @name error message fixed by Luke@M*U*S*H.
+   * One could @pcreate players past the hard db limit. Reported by Z@Korongil.
+   * Typos in config_h.SH and options.h.dist fixed by Oriens@Alexandria.
+   * Under some conditions, you could double-join a channel.
+     Reported by Xyrxwyrth@M*U*S*H, investigated by Steven@Champions.
+   * Error message for @chan/desc improved. Reported by Oriens@Alexandria.
+   * Typo in alias.cnf fixed by rodregis@M*U*S*H.
+   * @mvattr sometimes failed to remove the old attrib, when it was a 
+     standard attrib that could be abbreviated (@mvattr a/desc=b).
+     Fixed by Walker@M*U*S*H.
+   * Some english-matching (like 'get 1st foo') would fail. Reported by
+     Mystery8.
+   * Typo in help @verb reported by Greck.
+   * MacOS tweaks. [DW]
+   * Better detection of numbers that are too big. [SW]
+   * Wizards could crash the server by entering objects in their own
+     inventory. Reported by Howie@New Frontiers.
+ 
  Version 1.7.4 patchlevel 6		       June 11, 2001
  
  Minor changes:
***************
*** 84,90 ****
    * Paging a page-locked player didn't give the appropriate messages.
      Reported by Steven@Champions.
    * left, right, and mid are now ansi-aware. Patch by Luke@M*U*S*H.
!   * Help fixes to lexits(), name() (Noltar@Korongil), 1.7.4p3 (Matrim@M*U*S*H).
    * win32/cmds.h updated with prototypes for dismiss and desert by
      Noltar@Korongil. And hdrs/externs.h, too, by [SW].
    * Memory leak with using alphabetic q-registers in queued commands fixed.
--- 154,160 ----
    * Paging a page-locked player didn't give the appropriate messages.
      Reported by Steven@Champions.
    * left, right, and mid are now ansi-aware. Patch by Luke@M*U*S*H.
!   * Help fixes to lexits(), name() (Noltar@Korongil), 1.7.4p3 (Z@Korongil).
    * win32/cmds.h updated with prototypes for dismiss and desert by
      Noltar@Korongil. And hdrs/externs.h, too, by [SW].
    * Memory leak with using alphabetic q-registers in queued commands fixed.
***************
*** 112,118 ****
    * Distributed register.txt file is now more descriptive. 
      Suggested by Xyrxwyrth@M*U*S*H.
    * The ctime(), mtime(), restarttime(), and starttime() functions now 
!     return 2-digit days (01 vs. 1). Reported by Matrim@M*U*S*H.
    * @malias output uses the alias token more consistently. Suggested by
      Kyieren@M*U*S*H.
    * hints/solaris_2.sh modified a bit.
--- 182,188 ----
    * Distributed register.txt file is now more descriptive. 
      Suggested by Xyrxwyrth@M*U*S*H.
    * The ctime(), mtime(), restarttime(), and starttime() functions now 
!     return 2-digit days (01 vs. 1). Reported by Z@Korongil.
    * @malias output uses the alias token more consistently. Suggested by
      Kyieren@M*U*S*H.
    * hints/solaris_2.sh modified a bit.
***************
*** 135,141 ****
        the use of *playername to match the player (e.g. mail(), hidden()).
        (This is generally more consistent).
  Minor changes:
!   * @tr of a nonexistent attribute now reports that. Report by Matrim@M*U*S*H.
    * TEL_OK is an alias for JUMP_OK. Suggested by Kyieren@M*U*S*H.
    * Added 'help i18n' (aka help translation). Suggested by Kyieren@M*U*S*H.
    * When you use 'teach' and, as a result, run the command you are teaching,
--- 205,211 ----
        the use of *playername to match the player (e.g. mail(), hidden()).
        (This is generally more consistent).
  Minor changes:
!   * @tr of a nonexistent attribute now reports that. Report by Z@Korongil.
    * TEL_OK is an alias for JUMP_OK. Suggested by Kyieren@M*U*S*H.
    * Added 'help i18n' (aka help translation). Suggested by Kyieren@M*U*S*H.
    * When you use 'teach' and, as a result, run the command you are teaching,
*** 1_7_4.101/game/txt/hlp/pennvers.hlp Mon, 11 Jun 2001 10:50:03 -0500 dunemush (pennmush/12_pennvers.h 1.166 600)
--- 1_7_4.129(w)/game/txt/hlp/pennvers.hlp Tue, 10 Jul 2001 14:23:14 -0500 dunemush (pennmush/12_pennvers.h 1.169.1.15 600)
***************
*** 1,5 ****
  & changes
! & 1.7.4p6
  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.4p7
  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,87 ----
  A list of the patchlevels associated with each release can
  be read in 'help patchlevels'.
  
+ Version 1.7.4 patchlevel 7		       July 02, 2001
+ 
+ Major changes:
+   * %r can now evaluate to one character or two, based on a new config 
+     option, newline_one_char, which defaults to being yes. This allows
+     %r to be used as a list delimiter. However, this may
+     break softcode which expects strlen(%r) to be 2, but it's probably
+     smarter to fix the softcode than turn off this option. [sw]
+   * If a command and a standard attribute have the same name, the
+     command takes precedence. So if you have an @attribute named
+     "PEMIT", @pemit me=foo will do the command, not set the attribute. [SW]
+ Minor changes:
+   * When someone attempts to create too many attributes on an object,
+     the log indicates who and which object. Suggested by Frob@Battlestar
+     Galactica:TSC.
+   * Buncha tprintfs replaced with notify_formats. [SW] 
+   * New local_connect() and local_disconnect() hooks in local.dst.
+     Suggested by Eratl@M*U*S*H.
+   * lookup_player now deals with player names prefixed with "*",
+     so a bunch of commands like @newpassword will now treat those
+     arguments. Suggested by Glonk@GlonkMUSH.
+   * Make is more verbose about alerting you to changes in the 
+     src/*.dst files.
+   * The message for undestroying someone else's object more closely matches
+     the destroy message. Suggested by Noltar@Korongil.
+   * Server output that used to be tagged with "PRE" for Pueblo is now
+     tagged with "SAMP", because the original Pueblo client did not correctly
+     handle "<BR>\n" in PRE, and the newer clients that are supporting
+     the pueblo protocol, like MUSHclient, do handle it correctly, causing
+     an incompatibility problem. Our workaround is to avoid PRE. 
+     Reported by [NJG].
+   * The WHO list output is tagged <img xch_cmd=html> for Pueblo to get
+     appropriate newline handling. [NJG]
+   * help @mail mentions help @malias. Suggested by Trispis@M*U*S*H.
+   * Matching code now treats players you can't see like disconnected players
+     when matching *player. Reported by Walker@M*U*S*H.
+   * @newpassword now confirms whose password was changed. Suggested by
+     Xyrxwyrth@M*U*S*H.
+   * @chan/who and cwho() now include objects on the channel. Suggested by
+     Glonk@GlonkMUSH.
+   * q-register lookup is slightly faster. [SW]
+   * Floating-point numbers in exponential format (6.02e23) are always
+     accepted, not just when tiny_math is set. [SW]
+   * isint() and isnum() ignore the null_eq_zero option, since they already
+     ignore tiny_math. [SW]
+   * time() and convsecs() take an optional timezone argument that,
+     if 'UTC', makes them act the same way as utctime() and convutcsecs(). 
+     From MUX2. [SW]
+ Fixes:
+   * Additional range checking to avoid some bugs reported by Alierak. [SW]
+   * Fix to buglet in @name error with PLAYER_NAME_SPACES reported by
+     Luke@M*U*S*H.
+   * Typo in @name error message fixed by Luke@M*U*S*H.
+   * One could @pcreate players past the hard db limit. Reported by Z@Korongil.
+   * Typos in config_h.SH and options.h.dist fixed by Oriens@Alexandria.
+   * Under some conditions, you could double-join a channel.
+     Reported by Xyrxwyrth@M*U*S*H, investigated by Steven@Champions.
+   * Error message for @chan/desc improved. Reported by Oriens@Alexandria.
+   * Typo in alias.cnf fixed by rodregis@M*U*S*H.
+   * @mvattr sometimes failed to remove the old attrib, when it was a 
+     standard attrib that could be abbreviated (@mvattr a/desc=b).
+     Fixed by Walker@M*U*S*H.
+   * Some english-matching (like 'get 1st foo') would fail. Reported by
+     Mystery8.
+   * Typo in help @verb reported by Greck.
+   * MacOS tweaks. [DW]
+   * Better detection of numbers that are too big. [SW]
+   * Wizards could crash the server by entering objects in their own
+     inventory. Reported by Howie@New Frontiers.
+ 
+ & 1.7.4p6
  Version 1.7.4 patchlevel 6		       June 11, 2001
  
  Minor changes:
***************
*** 80,86 ****
    * Paging a page-locked player didn't give the appropriate messages.
      Reported by Steven@Champions.
    * left, right, and mid are now ansi-aware. Patch by Luke@M*U*S*H.
!   * Help fixes to lexits(), name() (Noltar@Korongil), 1.7.4p3 (Matrim@M*U*S*H).
    * win32/cmds.h updated with prototypes for dismiss and desert by
      Noltar@Korongil. And hdrs/externs.h, too, by [SW].
    * Memory leak with using alphabetic q-registers in queued commands fixed.
--- 151,157 ----
    * Paging a page-locked player didn't give the appropriate messages.
      Reported by Steven@Champions.
    * left, right, and mid are now ansi-aware. Patch by Luke@M*U*S*H.
!   * Help fixes to lexits(), name() (Noltar@Korongil), 1.7.4p3 (Z@Korongil).
    * win32/cmds.h updated with prototypes for dismiss and desert by
      Noltar@Korongil. And hdrs/externs.h, too, by [SW].
    * Memory leak with using alphabetic q-registers in queued commands fixed.
***************
*** 109,115 ****
    * Distributed register.txt file is now more descriptive. 
      Suggested by Xyrxwyrth@M*U*S*H.
    * The ctime(), mtime(), restarttime(), and starttime() functions now 
!     return 2-digit days (01 vs. 1). Reported by Matrim@M*U*S*H.
    * @malias output uses the alias token more consistently. Suggested by
      Kyieren@M*U*S*H.
    * hints/solaris_2.sh modified a bit.
--- 180,186 ----
    * Distributed register.txt file is now more descriptive. 
      Suggested by Xyrxwyrth@M*U*S*H.
    * The ctime(), mtime(), restarttime(), and starttime() functions now 
!     return 2-digit days (01 vs. 1). Reported by Z@Korongil.
    * @malias output uses the alias token more consistently. Suggested by
      Kyieren@M*U*S*H.
    * hints/solaris_2.sh modified a bit.
***************
*** 133,139 ****
        the use of *playername to match the player (e.g. mail(), hidden()).
        (This is generally more consistent).
  Minor changes:
!   * @tr of a nonexistent attribute now reports that. Report by Matrim@M*U*S*H.
    * TEL_OK is an alias for JUMP_OK. Suggested by Kyieren@M*U*S*H.
    * Added 'help i18n' (aka help translation). Suggested by Kyieren@M*U*S*H.
    * When you use 'teach' and, as a result, run the command you are teaching,
--- 204,210 ----
        the use of *playername to match the player (e.g. mail(), hidden()).
        (This is generally more consistent).
  Minor changes:
!   * @tr of a nonexistent attribute now reports that. Report by Z@Korongil.
    * TEL_OK is an alias for JUMP_OK. Suggested by Kyieren@M*U*S*H.
    * Added 'help i18n' (aka help translation). Suggested by Kyieren@M*U*S*H.
    * When you use 'teach' and, as a result, run the command you are teaching,
***************
*** 4700,4706 ****
  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
  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
--- 4771,4777 ----
  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
  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.101/game/txt/hlp/pennmail.hlp Fri, 23 Mar 2001 10:25:52 -0600 dunemush (pennmush/15_pennmail.h 1.7 600)
--- 1_7_4.129(w)/game/txt/hlp/pennmail.hlp Fri, 29 Jun 2001 12:32:44 -0500 dunemush (pennmush/15_pennmail.h 1.8 600)
***************
*** 22,29 ****
          Message #'s, in which case you send to the sender of that message.
          An alias name (see help @malias)
  
!   See the following topics:
!     mail-sending   mail-reading   mail-folders   mail-other   mail-admin
  & mail-reading
  
    @mail <msg #>
--- 22,29 ----
          Message #'s, in which case you send to the sender of that message.
          An alias name (see help @malias)
  
!   See also the following topics:  mail-sending   mail-reading   
!       mail-folders   mail-other   mail-admin     @malias
  & mail-reading
  
    @mail <msg #>
*** 1_7_4.101/game/txt/hlp/pennfunc.hlp Fri, 08 Jun 2001 14:14:28 -0500 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.1 600)
--- 1_7_4.129(w)/game/txt/hlp/pennfunc.hlp Sat, 07 Jul 2001 20:57:46 -0500 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.3 600)
***************
*** 530,536 ****
    
  & CONVSECS()
  & CONVUTCSECS()
!   convsecs(<seconds>)
    convutcsecs(<seconds>) 
  
    This function converts seconds to a time string, based on how many
--- 530,536 ----
    
  & CONVSECS()
  & CONVUTCSECS()
!   convsecs(<seconds>[, <zone>])
    convutcsecs(<seconds>) 
  
    This function converts seconds to a time string, based on how many
***************
*** 538,545 ****
    UTC, but returns local time, convsecs(0) is not going to be
    "Thu Jan 1 00:00:00 1970" unless you're in the UTC (GMT) timezone.
   
!   convutcsecs() returns the time based on UTC time instead of local
!   time.
    
    Example:
    > say [secs()]
--- 538,545 ----
    UTC, but returns local time, convsecs(0) is not going to be
    "Thu Jan 1 00:00:00 1970" unless you're in the UTC (GMT) timezone.
   
!   convutcsecs() and convsecs() with a second argument of 'utc' return
!   the time based on UTC time instead of the server's local time.
    
    Example:
    > say [secs()]
***************
*** 2496,2502 ****
    registers.  setq() returns a null string; it is a purely "side effect"
    function.  setr() returns the value stored.
    
!   There are thirtysix local registers, numbered 0 through 9 and A through Z.
    They are cleared at the start of each new queue cycle (i.e. whenever
    a new command is evaluated). They are most useful for storing
    complex function evaluations which are used repeatedly within a
--- 2496,2502 ----
    registers.  setq() returns a null string; it is a purely "side effect"
    function.  setr() returns the value stored.
    
!   There are thirty-six local registers, numbered 0 through 9 and A through Z.
    They are cleared at the start of each new queue cycle (i.e. whenever
    a new command is evaluated). They are most useful for storing
    complex function evaluations which are used repeatedly within a
***************
*** 2889,2903 ****
    See also: @tel
  & TIME()
  & UTCTIME()
!   time()
    utctime()
  
    time() gives you the current time on the MUSH.
    WARNING!  This is the time on the machine that the mush is running
    on, and not where you are.
  
!   utctime() gives the same time in UTC (Aka GMT), not the server's
!   timezone.
  
  See also: timefmt(), timestring(), convsecs(), convtime()
  & ETIMEFMT()
--- 2889,2903 ----
    See also: @tel
  & TIME()
  & UTCTIME()
!   time([<zone>])
    utctime()
  
    time() gives you the current time on the MUSH.
    WARNING!  This is the time on the machine that the mush is running
    on, and not where you are.
  
!   utctime() and time(utc) give the same time in UTC (Aka GMT), not the server's
!   local timezone.
  
  See also: timefmt(), timestring(), convsecs(), convtime()
  & ETIMEFMT()
*** 1_7_4.101/game/txt/hlp/penncmd.hlp Mon, 11 Jun 2001 10:50:03 -0500 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.2 600)
--- 1_7_4.129(w)/game/txt/hlp/penncmd.hlp Fri, 06 Jul 2001 13:47:58 -0500 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4 600)
***************
*** 2796,2802 ****
      doesn't have an <owhat>.
    <victim> executes the contents of his <awhat> attribute.
    
!   By supplying up to nine <args>, you may pass those values on
    the stack (i.e. %0, %1, %2, etc. up through %9).
    
    See "help @verb2" for more.
--- 2796,2802 ----
      doesn't have an <owhat>.
    <victim> executes the contents of his <awhat> attribute.
    
!   By supplying up to ten <args>, you may pass those values on
    the stack (i.e. %0, %1, %2, etc. up through %9).
    
    See "help @verb2" for more.
***************
*** 2816,2822 ****
  & @verb3
    Example:
    
!   &VERB_EXAMPLE Test Object=$test:@verb me=%N,TEST,You just tested.,OTEST,
         just tested the example.,ATEST,%N
    test
    > You just tested.
--- 2816,2822 ----
  & @verb3
    Example:
    
!   &VERB_EXAMPLE Test Object=$test:@verb me=%#,TEST,You just tested.,OTEST,
         just tested the example.,ATEST,%N
    test
    > You just tested.
*** 1_7_4.101/game/mushcnf.dst Mon, 12 Feb 2001 16:29:23 -0600 dunemush (pennmush/41_mushcnf.ds 1.1.1.19.1.1 600)
--- 1_7_4.129(w)/game/mushcnf.dst Sat, 07 Jul 2001 21:03:12 -0500 dunemush (pennmush/41_mushcnf.ds 1.1.1.19.1.1.1.1 600)
***************
*** 554,559 ****
--- 554,565 ----
  # "hi!", or not (producing <whatever> X says, ""hi!").
  chat_strip_quote yes
  
+ 
+ # Should strlen(%r) be 1 or 2? Turning this option on will allow %r to be
+ # used as a list delimiter, but might break formatting softcode that depends
+ # on its length being 2.
+ newline_one_char yes
+ 
  ###
  ### Default flags for newly created stuff
  ###
*** 1_7_4.101/config_h.SH Mon, 26 Mar 2001 15:53:23 -0600 dunemush (pennmush/b/17_config_h.S 1.17.1.2 660)
--- 1_7_4.129(w)/config_h.SH Sat, 30 Jun 2001 08:58:56 -0500 dunemush (pennmush/b/17_config_h.S 1.17.1.2.1.1 660)
***************
*** 410,416 ****
  #endif
  
  /* WIN32_CDECL:
!  *	Defined as __cdecl if the compiler can handle a that keyword to specify
   *	C-style argument passing conventions. This allows MS VC++
   *	on Win32 to use the __fastcall convention for everything else
   *	and get a performance boost. Any compiler with a brain (read:
--- 410,416 ----
  #endif
  
  /* WIN32_CDECL:
!  *	Defined as __cdecl if the compiler can handle that keyword to specify
   *	C-style argument passing conventions. This allows MS VC++
   *	on Win32 to use the __fastcall convention for everything else
   *	and get a performance boost. Any compiler with a brain (read:
***************
*** 587,593 ****
  #$d_memmove HAS_MEMMOVE	/**/
  
  /* CAN_NEWSTYLE:
!  *	Defined if new-style functions definitions are allowable.
   *	If they are, we can avoid some warnings that you get if
   *	you declare char arguments in a prototype and use old-style
   *	function definitions, which implicitly promote them to ints.
--- 587,593 ----
  #$d_memmove HAS_MEMMOVE	/**/
  
  /* CAN_NEWSTYLE:
!  *	Defined if new-style function definitions are allowable.
   *	If they are, we can avoid some warnings that you get if
   *	you declare char arguments in a prototype and use old-style
   *	function definitions, which implicitly promote them to ints.
***************
*** 595,607 ****
  #$d_newstyle CAN_NEWSTYLE /**/
  
  /* HAS_RANDOM:
!  *	Have we got random(), our first choice for number generation.
   */
  /* HAS_LRAND48:
!  *	Have we got lrand48(), our second choice.
   */
  /* HAS_RAND:
!  *	Have we got rand(), our last choice.
   */
  #$d_random HAS_RANDOM	/**/
  #$d_lrand48 HAS_LRAND48	/**/
--- 595,607 ----
  #$d_newstyle CAN_NEWSTYLE /**/
  
  /* HAS_RANDOM:
!  *	Have we got random(), our first choice for number generation?
   */
  /* HAS_LRAND48:
!  *	Have we got lrand48(), our second choice?
   */
  /* HAS_RAND:
!  *	Have we got rand(), our last choice?
   */
  #$d_random HAS_RANDOM	/**/
  #$d_lrand48 HAS_LRAND48	/**/
***************
*** 722,729 ****
  #$d_uwait UNION_WAIT		/**/
  
  /* HAS_VSNPRINTF:
!  *	This symbol, if defined, indicates that the vsnprintf routine is available
!  *	to printf with a pointer to an argument list.  If unavailable, you
   *	may need to write your own, probably in terms of _doprnt().
   */
  #$d_vsnprintf HAS_VSNPRINTF	/**/
--- 722,729 ----
  #$d_uwait UNION_WAIT		/**/
  
  /* HAS_VSNPRINTF:
!  *	This symbol, if defined, indicates that the vsnprintf routine is 
!  *	available to printf with a pointer to an argument list.  If not, you
   *	may need to write your own, probably in terms of _doprnt().
   */
  #$d_vsnprintf HAS_VSNPRINTF	/**/
*** 1_7_4.101/src/local.dst Wed, 29 Nov 2000 11:35:38 -0600 dunemush (pennmush/b/19_local.dst 1.5 660)
--- 1_7_4.129(w)/src/local.dst Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/19_local.dst 1.6 660)
***************
*** 87,92 ****
--- 87,110 ----
  {
  }
  
+ /* Called when a player connects. If this is a new creation,
+  * isnew will be true. num gives the number of connections by
+  * that player (so if num > 1, this is a multiple connect).
+  */
+ void
+ local_connect(dbref player, int isnew, int num)
+ {
+ }
+ 
+ /* Called when a player disconnects. If num > 1, this is
+  * a partial disconnect.
+  */
+ void
+ local_disconnect(dbref player, int num)
+ {
+ }
+ 
+ 
  #ifdef LOCAL_DATA
  /* For serious hackers only */
  
*** 1_7_4.101/src/cmdlocal.dst Wed, 10 Jan 2001 12:33:19 -0600 dunemush (pennmush/b/21_cmdlocal.d 1.7 660)
--- 1_7_4.129(w)/src/cmdlocal.dst Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/21_cmdlocal.d 1.8 660)
***************
*** 52,59 ****
  #ifdef EXAMPLE
  COMMAND (cmd_local_silly) {
    if (SW_ISSET(sw, SWITCH_NOISY))
!     notify(player, tprintf("Noisy silly with %s", arg_left));
!   notify(player, tprintf("SillyCommand %s", arg_left));
  }
  #endif
  
--- 52,59 ----
  #ifdef EXAMPLE
  COMMAND (cmd_local_silly) {
    if (SW_ISSET(sw, SWITCH_NOISY))
!     notify_format(player, "Noisy silly with %s", arg_left);
!   notify_format(player, "SillyCommand %s", arg_left);
  }
  #endif
  
*** 1_7_4.101/src/wiz.c Mon, 11 Jun 2001 10:50:03 -0500 dunemush (pennmush/b/23_wiz.c 1.44.1.1.1.1.1.2 660)
--- 1_7_4.129(w)/src/wiz.c Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/23_wiz.c 1.44.1.1.1.1.1.2.1.4 660)
***************
*** 102,107 ****
--- 102,109 ----
      notify(creator, T("You do not have the power over body and mind!"));
      return NOTHING;
    }
+   if (!can_pay_fees(creator, 0))
+     return NOTHING;
    player = create_player(player_name, player_password, "None", "None");
    if (player == NOTHING) {
      notify(creator,
***************
*** 336,343 ****
      victim = player;
      to = arg1;
    } else {
!     if ((victim = noisy_match_result(player, arg1, NOTYPE, MAT_OBJECTS | MAT_ENGLISH)) ==
! 	NOTHING) {
        return;
      }
      to = arg2;
--- 338,346 ----
      victim = player;
      to = arg1;
    } else {
!     if ((victim =
! 	 noisy_match_result(player, arg1, NOTYPE,
! 			    MAT_OBJECTS | MAT_ENGLISH)) == NOTHING) {
        return;
      }
      to = arg2;
***************
*** 718,726 ****
    } else {
      /* it's ok, do it */
      (void) atr_add(victim, "XYXXY", mush_crypt(password), GOD, NOTHING);
!     notify(player, T("Password changed."));
!     notify(victim, tprintf(T("Your password has been changed by %s."),
! 			   Name(player)));
      do_log(LT_WIZ, player, victim, "*** NEWPASSWORD ***");
    }
  }
--- 721,729 ----
    } else {
      /* it's ok, do it */
      (void) atr_add(victim, "XYXXY", mush_crypt(password), GOD, NOTHING);
!     notify_format(player, T("Password for %s changed."), Name(victim));
!     notify_format(victim, T("Your password has been changed by %s."),
! 		  Name(player));
      do_log(LT_WIZ, player, victim, "*** NEWPASSWORD ***");
    }
  }
*** 1_7_4.101/src/warnings.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/b/25_warnings.c 1.17 660)
--- 1_7_4.129(w)/src/warnings.c Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/25_warnings.c 1.18 660)
***************
*** 116,123 ****
      const char *name;
      const char *desc;
  {
!   notify(player, tprintf(T("Warning '%s' for %s:"),
! 			 name, unparse_object(player, i)));
    notify(player, desc);
  }
  
--- 116,123 ----
      const char *name;
      const char *desc;
  {
!   notify_format(player, T("Warning '%s' for %s:"),
! 		name, unparse_object(player, i));
    notify(player, desc);
  }
  
***************
*** 305,311 ****
        }
        /* At this point, we haven't matched any warnings. */
        if (!found) {
! 	notify(player, tprintf(T("Unknown warning: %s"), w));
        }
        w = split_token(&s, ' ');
      }
--- 305,311 ----
        }
        /* At this point, we haven't matched any warnings. */
        if (!found) {
! 	notify_format(player, T("Unknown warning: %s"), w);
        }
        w = split_token(&s, ' ');
      }
***************
*** 314,320 ****
      } else {
        Warnings(thing) &= ~negate_flags;
      }
!     notify(player, tprintf(T("@warnings set to %s"), unparse_warnings(thing)));
      return;
    }
  }
--- 314,320 ----
      } else {
        Warnings(thing) &= ~negate_flags;
      }
!     notify_format(player, T("@warnings set to %s"), unparse_warnings(thing));
      return;
    }
  }
*** 1_7_4.101/src/version.c Wed, 06 Sep 2000 20:09:35 -0500 dunemush (pennmush/b/26_version.c 1.5 660)
--- 1_7_4.129(w)/src/version.c Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/26_version.c 1.6 660)
***************
*** 30,51 ****
  {
    char buff[BUFFER_LEN];
  
!   notify(player, tprintf(T("You are connected to %s"), MUDNAME));
  
    strcpy(buff, ctime(&start_time));
    buff[strlen(buff) - 1] = '\0';	/* eat the newline */
!   notify(player, tprintf(T("Last restarted: %s"), buff));
  
!   notify(player, tprintf("%s", VERSION));
  #ifdef PATCHES
!   notify(player, tprintf("Patches: %s", PATCHES));
  #endif
  #ifdef WIN32
!   notify(player, tprintf(T("Build date: %s"), __DATE__));
  #else
!   notify(player, tprintf(T("Build date: %s"), BUILDDATE));
!   notify(player, tprintf("Compiler: %s", COMPILER));
!   notify(player, tprintf(T("Compilation flags: %s"), CCFLAGS));
!   notify(player, tprintf(T("Malloc package: %d"), MALLOC_PACKAGE));
  #endif
  }
--- 30,51 ----
  {
    char buff[BUFFER_LEN];
  
!   notify_format(player, T("You are connected to %s"), MUDNAME);
  
    strcpy(buff, ctime(&start_time));
    buff[strlen(buff) - 1] = '\0';	/* eat the newline */
!   notify_format(player, T("Last restarted: %s"), buff);
  
!   notify_format(player, "%s", VERSION);
  #ifdef PATCHES
!   notify_format(player, "Patches: %s", PATCHES);
  #endif
  #ifdef WIN32
!   notify_format(player, T("Build date: %s"), __DATE__);
  #else
!   notify_format(player, T("Build date: %s"), BUILDDATE);
!   notify_format(player, T("Compiler: %s"), COMPILER);
!   notify_format(player, T("Compilation flags: %s"), CCFLAGS);
!   notify_format(player, T("Malloc package: %d"), MALLOC_PACKAGE);
  #endif
  }
*** 1_7_4.101/src/help.c Thu, 31 May 2001 11:20:12 -0500 dunemush (pennmush/f/32_help.c 1.4.1.2.1.1.1.3.2.2.1.1.2.1.1.2 660)
--- 1_7_4.129(w)/src/help.c Tue, 10 Jul 2001 14:23:19 -0500 dunemush (pennmush/f/32_help.c 1.4.1.2.1.1.1.3.2.2.1.1.2.1.1.2.1.2 660)
***************
*** 217,223 ****
    }
  
    if (!entry) {
!     notify(player, tprintf(T("No entry for '%s'."), arg1));
      return;
    }
  
--- 217,223 ----
    }
  
    if (!entry) {
!     notify_format(player, T("No entry for '%s'."), arg1);
      return;
    }
  
***************
*** 242,248 ****
      notify(player, the_topic);
  
    if (SUPPORT_PUEBLO)
!     notify_noenter(player, tprintf("%cPRE%c", TAG_START, TAG_END));
    for (n = 0; n < BUFFER_LEN; n++) {
      if (fgets(line, LINE_SIZE, fp) == NULL)
        break;
--- 242,248 ----
      notify(player, the_topic);
  
    if (SUPPORT_PUEBLO)
!     notify_noenter(player, tprintf("%cSAMP%c", TAG_START, TAG_END));
    for (n = 0; n < BUFFER_LEN; n++) {
      if (fgets(line, LINE_SIZE, fp) == NULL)
        break;
***************
*** 258,267 ****
      }
    }
    if (SUPPORT_PUEBLO)
!     notify(player, tprintf("%c/PRE%c", TAG_START, TAG_END));
    fclose(fp);
    if (n >= BUFFER_LEN)
!     notify(player, tprintf(T("%s output truncated."), help_dat->command));
  }
  
  void
--- 258,267 ----
      }
    }
    if (SUPPORT_PUEBLO)
!     notify_format(player, "%c/SAMP%c", TAG_START, TAG_END);
    fclose(fp);
    if (n >= BUFFER_LEN)
!     notify_format(player, T("%s output truncated."), help_dat->command);
  }
  
  void
*** 1_7_4.101/src/htab.c Mon, 11 Jun 2001 10:50:03 -0500 dunemush (pennmush/b/30_htab.c 1.8.1.1 660)
--- 1_7_4.129(w)/src/htab.c Tue, 10 Jul 2001 14:23:19 -0500 dunemush (pennmush/b/30_htab.c 1.8.1.2 660)
***************
*** 250,267 ****
      while (hent) {
        nent = hent->next;
        hval = hash_val(hent->key, mask);
!       for (curr = newarr[hval], old = NULL;
!            curr;
!            old = curr, curr = curr->next) {
!         if (strcmp(curr->key, hent->key) > 0)
!           break;
        }
        if (old) {
!         old->next = hent;
!         hent->next = curr;
        } else {
!         hent->next = newarr[hval];
!         newarr[hval] = hent;
        }
        hent = nent;
      }
--- 250,265 ----
      while (hent) {
        nent = hent->next;
        hval = hash_val(hent->key, mask);
!       for (curr = newarr[hval], old = NULL; curr; old = curr, curr = curr->next) {
! 	if (strcmp(curr->key, hent->key) > 0)
! 	  break;
        }
        if (old) {
! 	old->next = hent;
! 	hent->next = curr;
        } else {
! 	hent->next = newarr[hval];
! 	newarr[hval] = hent;
        }
        hent = nent;
      }
***************
*** 447,455 ****
  hash_stats_header(player)
      dbref player;
  {
!   notify(player,
! 	 tprintf
! 	 ("Table      Buckets Entries LChain  ECh  1Ch  2Ch  3Ch 4+Ch  AvgCh ~Memory"));
  }
  
  void
--- 445,452 ----
  hash_stats_header(player)
      dbref player;
  {
!   notify_format(player,
! 		"Table      Buckets Entries LChain  ECh  1Ch  2Ch  3Ch 4+Ch  AvgCh ~Memory");
  }
  
  void
***************
*** 492,500 ****
    for (n = 1; n < 5; n++)
      totchains += lengths[n];
  
!   notify(player,
! 	 tprintf("%-10s %7d %7d %6d %4d %4d %4d %4d %4d %6.3f %7u", hname,
! 		 htab->hashsize, htab->entries, longest, lengths[0], lengths[1],
! 		 lengths[2], lengths[3], lengths[4],
! 		 totchains == 0.0 ? 0.0 : chainlens / totchains, bytes));
  }
--- 489,497 ----
    for (n = 1; n < 5; n++)
      totchains += lengths[n];
  
!   notify_format(player,
! 		"%-10s %7d %7d %6d %4d %4d %4d %4d %4d %6.3f %7u", hname,
! 		htab->hashsize, htab->entries, longest, lengths[0], lengths[1],
! 		lengths[2], lengths[3], lengths[4],
! 		totchains == 0.0 ? 0.0 : chainlens / totchains, bytes);
  }
*** 1_7_4.101/src/strutil.c Thu, 31 May 2001 15:33:03 -0500 dunemush (pennmush/b/33_strutil.c 1.28.1.3.1.3.1.5 660)
--- 1_7_4.129(w)/src/strutil.c Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/33_strutil.c 1.28.1.3.1.3.1.6 660)
***************
*** 1095,1101 ****
  
    depopulate_codes(as);
  
!   if (start > as->len)
      return safe_str("", buff, bp);
  
    /* Find the starting codes */
--- 1095,1101 ----
  
    depopulate_codes(as);
  
!   if (start > as->len || start < 0 || as->len < 0)
      return safe_str("", buff, bp);
  
    /* Find the starting codes */
*** 1_7_4.101/src/speech.c Mon, 11 Jun 2001 10:50:03 -0500 dunemush (pennmush/b/35_speech.c 1.21.1.2.1.3.1.5.1.1.1.7.1.3.1.1 660)
--- 1_7_4.129(w)/src/speech.c Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/35_speech.c 1.21.1.2.1.3.1.5.1.1.1.7.1.3.1.1.1.1 660)
***************
*** 535,547 ****
      who = noisy_match_result(player, p, NOTYPE, MAT_ABSOLUTE);
      if (GoodObject(who) && okay_pemit(player, who)) {
        if (Nospoof(who)) {
! 	  bp = tbuf;
! 	  if (Paranoid(who))
! 	    safe_format(tbuf, &bp, "[%s(#%d)->] ", Name(player), player);
! 	  else
! 	    safe_format(tbuf, &bp, "[%s->] ", Name(player));
! 	  safe_str(message, tbuf, &bp);
! 	  *bp = '\0';
  	notify(who, tbuf);
        } else {
  	notify(who, message);
--- 535,547 ----
      who = noisy_match_result(player, p, NOTYPE, MAT_ABSOLUTE);
      if (GoodObject(who) && okay_pemit(player, who)) {
        if (Nospoof(who)) {
! 	bp = tbuf;
! 	if (Paranoid(who))
! 	  safe_format(tbuf, &bp, "[%s(#%d)->] ", Name(player), player);
! 	else
! 	  safe_format(tbuf, &bp, "[%s->] ", Name(player));
! 	safe_str(message, tbuf, &bp);
! 	*bp = '\0';
  	notify(who, tbuf);
        } else {
  	notify(who, message);
*** 1_7_4.101/src/set.c Mon, 11 Jun 2001 10:50:03 -0500 dunemush (pennmush/b/38_set.c 1.26.1.3 660)
--- 1_7_4.129(w)/src/set.c Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/38_set.c 1.26.1.5 660)
***************
*** 103,111 ****
  	  password = newname;
  	  while (*password && !isspace(*password))
  	    password++;
! 	  *password++ = '\0';
! 	  while (*password && isspace(*password))
! 	    password++;
  	}
        } else {
  
--- 103,113 ----
  	  password = newname;
  	  while (*password && !isspace(*password))
  	    password++;
! 	  if (*password) {
! 	    *password++ = '\0';
! 	    while (*password && isspace(*password))
! 	      password++;
! 	  }
  	}
        } else {
  
***************
*** 125,131 ****
        if (!God(player) && !*password) {
  	notify(player,
  	       T("You must specify a password to change a player name."));
! 	notify(player, T("E.g.: name player = newname password"));
  	return;
        } else if (!God(player) && !password_check(thing, password)) {
  	notify(player, T("Incorrect password."));
--- 127,133 ----
        if (!God(player) && !*password) {
  	notify(player,
  	       T("You must specify a password to change a player name."));
! 	notify(player, T("E.g.: @name player = newname password"));
  	return;
        } else if (!God(player) && !password_check(thing, password)) {
  	notify(player, T("Incorrect password."));
***************
*** 655,661 ****
      notify(player, tprintf(T("Attribute %s (%d copies)"),
  			   (move ? "moved" : "copied"), copies));
      if (move)
!       do_set_atr(oldobj, p, NULL, player, 1);
    } else {
      notify(player, tprintf(T("Unable to %s attribute."),
  			   (move ? "move" : "copy")));
--- 657,663 ----
      notify(player, tprintf(T("Attribute %s (%d copies)"),
  			   (move ? "moved" : "copied"), copies));
      if (move)
!       do_set_atr(oldobj, AL_NAME(a), NULL, player, 1);
    } else {
      notify(player, tprintf(T("Unable to %s attribute."),
  			   (move ? "move" : "copy")));
***************
*** 758,769 ****
    *tbufp = '\0';
    *tbufap = '\0';
  
!   if (do_set_atr(thing, a->name, tbuf1, player, 0) &&
        !Quiet(player) && !Quiet(thing)) {
      if (!ansi_long_flag && ShowAnsi(player))
!       notify(player, tprintf("%s - Set: %s", a->name, tbuf_ansi));
      else
!       notify(player, tprintf("%s - Set: %s", a->name, tbuf1));
    }
  
    return 1;
--- 760,771 ----
    *tbufp = '\0';
    *tbufap = '\0';
  
!   if (do_set_atr(thing, AL_NAME(a), tbuf1, player, 0) &&
        !Quiet(player) && !Quiet(thing)) {
      if (!ansi_long_flag && ShowAnsi(player))
!       notify(player, tprintf("%s - Set: %s", AL_NAME(a), tbuf_ansi));
      else
!       notify(player, tprintf("%s - Set: %s", AL_NAME(a), tbuf1));
    }
  
    return 1;
*** 1_7_4.101/src/rob.c Mon, 11 Jun 2001 10:50:03 -0500 dunemush (pennmush/b/42_rob.c 1.18.1.2.1.2 660)
--- 1_7_4.129(w)/src/rob.c Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/42_rob.c 1.18.1.2.1.3 660)
***************
*** 137,143 ****
    int i;
  
    /* check recipient */
!   switch (who = match_result(player, recipient, TYPE_PLAYER, MAT_NEAR_THINGS | MAT_ENGLISH)) {
    case NOTHING:
      notify(player, T("Give to whom?"));
      return;
--- 137,145 ----
    int i;
  
    /* check recipient */
!   switch (who =
! 	  match_result(player, recipient, TYPE_PLAYER,
! 		       MAT_NEAR_THINGS | MAT_ENGLISH)) {
    case NOTHING:
      notify(player, T("Give to whom?"));
      return;
***************
*** 157,163 ****
    /* must be giving object */
    if (*s) {
      dbref thing;
!     switch (thing = match_result(player, amnt, TYPE_THING, MAT_POSSESSION | MAT_ENGLISH)) {
      case NOTHING:
        notify(player, T("You don't have that!"));
        return;
--- 159,167 ----
    /* must be giving object */
    if (*s) {
      dbref thing;
!     switch (thing =
! 	    match_result(player, amnt, TYPE_THING,
! 			 MAT_POSSESSION | MAT_ENGLISH)) {
      case NOTHING:
        notify(player, T("You don't have that!"));
        return;
*** 1_7_4.101/src/predicat.c Thu, 31 May 2001 11:19:20 -0500 dunemush (pennmush/b/44_predicat.c 1.1.1.34.1.1.1.3.1.2 660)
--- 1_7_4.129(w)/src/predicat.c Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/44_predicat.c 1.1.1.34.1.1.1.3.1.3 660)
***************
*** 417,423 ****
    }
    /* Can they afford it? */
    if (!NoPay(who) && (Pennies(Owner(who)) < pennies)) {
!     notify(who, tprintf(T("Sorry, you don't have enough %s."), MONIES));
      return 0;
    }
    /* check building quota */
--- 417,423 ----
    }
    /* Can they afford it? */
    if (!NoPay(who) && (Pennies(Owner(who)) < pennies)) {
!     notify_format(who, T("Sorry, you don't have enough %s."), MONIES);
      return 0;
    }
    /* check building quota */
***************
*** 815,826 ****
        free((Malloc_t) asave);
        if (*buff) {
  	ptr = (struct tm *) localtime(&mudtime);
! 	notify(player, tprintf(T("%s message from %s: %s"), type,
! 			       Name(target), buff));
  	if (!Haven(target))
! 	  notify(target,
! 		 tprintf(T("[%d:%02d] %s message sent to %s."), ptr->tm_hour,
! 			 ptr->tm_min, type, Name(player)));
        }
      } else if (def && *def)
        notify(player, def);
--- 815,826 ----
        free((Malloc_t) asave);
        if (*buff) {
  	ptr = (struct tm *) localtime(&mudtime);
! 	notify_format(player, T("%s message from %s: %s"), type,
! 		      Name(target), buff);
  	if (!Haven(target))
! 	  notify_format(target,
! 			T("[%d:%02d] %s message sent to %s."), ptr->tm_hour,
! 			ptr->tm_min, type, Name(player));
        }
      } else if (def && *def)
        notify(player, def);
*** 1_7_4.101/src/plyrlist.c Tue, 07 Nov 2000 15:36:38 -0600 dunemush (pennmush/b/46_plyrlist.c 1.5 660)
--- 1_7_4.129(w)/src/plyrlist.c Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/46_plyrlist.c 1.5.1.1 660)
***************
*** 68,73 ****
--- 68,75 ----
      p = atoi(name);
      return ((GoodObject(p) && IsPlayer(p)) ? p : NOTHING);
    }
+   if (*name == LOOKUP_TOKEN)
+     name++;
    hval = hashfind(strupper(name), &htab_player_list);
    if (!hval)
      return NOTHING;
*** 1_7_4.101/src/player.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/b/47_player.c 1.15.1.1.1.1.1.1 660)
--- 1_7_4.129(w)/src/player.c Tue, 10 Jul 2001 14:23:21 -0500 dunemush (pennmush/b/47_player.c 1.15.1.1.1.1.1.3 660)
***************
*** 199,204 ****
--- 199,209 ----
      do_log(LT_CONN, 0, 0, T("Failed creation (bad password) from %s"), host);
      return AMBIGUOUS;
    }
+   if (DBTOP_MAX && (db_top >= DBTOP_MAX + 1) && (first_free == NOTHING)) {
+     /* Oops, out of db space! */
+     do_log(LT_CONN, 0, 0, T("Failed creation (no db space) from %s"), host);
+     return NOTHING;
+   }
    /* else he doesn't already exist, create him */
    return make_player(name, password, host, ip);
  }
***************
*** 271,276 ****
--- 276,286 ----
      return NOTHING;
    }
  
+   if (DBTOP_MAX && (db_top >= DBTOP_MAX + 1) && (first_free == NOTHING)) {
+     /* Oops, out of db space! */
+     do_log(LT_CONN, 0, 0, T("Failed registration (no db space) from %s"), host);
+     return NOTHING;
+   }
  
    /* Come up with a random password of length 7-12 chars */
    len = get_random_long(7, 12);
***************
*** 464,479 ****
    if (h && a) {
      strcpy(last_place, uncompress(h->value));
      strcpy(last_time, uncompress(a->value));
!     notify(player, tprintf(T("Last connect was from %s on %s."),
! 			   last_place, last_time));
    }
    /* How about last failed connection */
    h = atr_get_noparent(player, "LASTFAILED");
    if (h && a) {
      strcpy(last_place, uncompress(h->value));
      if (strlen(last_place) > 2)
!       notify(player,
! 	     tprintf(T("Last FAILED connect was from %s."), last_place));
    }
    /* if there is no Lastsite, then the player is newly created.
     * the extra variables are a kludge to work around some weird
--- 474,488 ----
    if (h && a) {
      strcpy(last_place, uncompress(h->value));
      strcpy(last_time, uncompress(a->value));
!     notify_format(player, T("Last connect was from %s on %s."),
! 		  last_place, last_time);
    }
    /* How about last failed connection */
    h = atr_get_noparent(player, "LASTFAILED");
    if (h && a) {
      strcpy(last_place, uncompress(h->value));
      if (strlen(last_place) > 2)
!       notify_format(player, T("Last FAILED connect was from %s."), last_place);
    }
    /* if there is no Lastsite, then the player is newly created.
     * the extra variables are a kludge to work around some weird
*** 1_7_4.101/src/parse.c Mon, 29 Jan 2001 09:51:40 -0600 dunemush (pennmush/b/48_parse.c 1.23.1.7 660)
--- 1_7_4.129(w)/src/parse.c Tue, 10 Jul 2001 14:23:20 -0500 dunemush (pennmush/b/48_parse.c 1.23.1.8 660)
***************
*** 91,96 ****
--- 91,117 ----
  
  #endif
  
+ /* Indexes of valid q-regs into the renv array. -1 is error. */
+ signed char qreg_indexes[UCHAR_MAX + 1] = {
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
+   -1, 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, -1, -1, -1, -1,
+   -1, 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, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
+ 
+ 
  dbref
  parse_dbref(str)
      char const *str;
***************
*** 166,173 ****
  is_integer(str)
      char const *str;
  {
!   char const *p = str;
!   int val;
    /* If we're emulating Tiny, anything is an integer */
    if (TINY_MATH)
      return 1;
--- 187,194 ----
  is_integer(str)
      char const *str;
  {
!   char *end;
! 
    /* If we're emulating Tiny, anything is an integer */
    if (TINY_MATH)
      return 1;
***************
*** 175,192 ****
      return 0;
    while (isspace(*str))
      str++;
!   if (!*str)
!     return (NULL_EQ_ZERO ? 1 : 0);
!   if ((*str == '-') && isdigit(str[1]))
!     str += 2;
!   while (isdigit(*str))
!     str++;
!   while (isspace(*str))
!     str++;
!   if (*str)
!     return 0;
!   val = parse_integer(p);
!   if ((val > HUGE_INT) || (-val > HUGE_INT))
      return 0;
    return 1;
  }
--- 196,206 ----
      return 0;
    while (isspace(*str))
      str++;
!   if (*str == '\0')
!     return NULL_EQ_ZERO;
!   errno = 0;
!   strtol(str, &end, 10);
!   if (errno == ERANGE || *end != '\0')
      return 0;
    return 1;
  }
***************
*** 195,220 ****
  is_uinteger(str)
      char const *str;
  {
!   char const *p = str;
!   unsigned int val;
    /* If we're emulating Tiny, anything is an integer */
    if (TINY_MATH)
      return 1;
    if (!str)
      return 0;
    while (isspace(*str))
      str++;
!   if (!*str)
!     return (NULL_EQ_ZERO ? 1 : 0);
!   while (isdigit(*str))
!     str++;
!   while (isspace(*str))
!     str++;
!   if (*str)
      return 0;
    errno = 0;
!   val = parse_uinteger(p);
!   if (val == ULONG_MAX || errno == ERANGE)
      return 0;
    return 1;
  }
--- 209,231 ----
  is_uinteger(str)
      char const *str;
  {
!   char *end;
! 
    /* If we're emulating Tiny, anything is an integer */
    if (TINY_MATH)
      return 1;
    if (!str)
      return 0;
+ /* strtoul() accepts negative numbers, so we still have to do this check */
    while (isspace(*str))
      str++;
!   if (*str == '\0')
!     return NULL_EQ_ZERO;
!   if (!(isdigit(*str) || *str == '+'))
      return 0;
    errno = 0;
!   strtoul(str, &end, 10);
!   if (errno == ERANGE || *end != '\0')
      return 0;
    return 1;
  }
***************
*** 223,279 ****
  is_strict_number(str)
      char const *str;
  {
!   char const *p = str;
    NVAL val;
- 
    if (!str)
      return 0;
!   while (isspace(*str))
!     str++;
!   if (!*str)
!     return (NULL_EQ_ZERO ? 1 : 0);
!   if (((*str == '-') || (*str == '+')) && str[1])
!     str++;
!   while (isdigit(*str))
!     str++;
!   if (*str == '.')
!     str++;
!   while (isdigit(*str))
!     str++;
!   while (isspace(*str))
!     str++;
!   if (*str)
!     return 0;
!   val = parse_number(p);
!   if ((val > HUGE_NVAL) || (-val > HUGE_NVAL))
      return 0;
!   return 1;
  }
  
  int
  is_strict_integer(str)
      const char *str;
  {
!   const char *p = str;
    int val;
    if (!str)
      return 0;
!   while (isspace(*str))
!     str++;
!   if (!*str)
!     return (NULL_EQ_ZERO ? 1 : 0);
!   if (((*str == '-') || (*str == '+')) && str[1])
!     str++;
!   while (isdigit(*str))
!     str++;
!   while (isspace(*str))
!     str++;
!   if (*str)
!     return 0;
!   val = parse_integer(p);
!   if ((val > HUGE_INT) || (-val > HUGE_INT))
      return 0;
!   return 1;
  }
  
  int
--- 234,263 ----
  is_strict_number(str)
      char const *str;
  {
!   char *end;
    NVAL val;
    if (!str)
      return 0;
!   errno = 0;
!   val = strtod(str, &end);
!   if (errno == ERANGE || *end != '\0')
      return 0;
!   return end > str;
  }
  
  int
  is_strict_integer(str)
      const char *str;
  {
!   char *end;
    int val;
    if (!str)
      return 0;
!   errno = 0;
!   val = strtol(str, &end, 10);
!   if (errno == ERANGE || *end != '\0')
      return 0;
!   return end > str;
  }
  
  int
***************
*** 283,288 ****
--- 267,276 ----
    /* If we're emulating Tiny, anything is a number */
    if (TINY_MATH)
      return 1;
+   while (isspace(*str))
+     str++;
+   if (*str == '\0')
+     return NULL_EQ_ZERO;
    return is_strict_number(str);
  }
  
***************
*** 334,341 ****
    char temp[3];
    int temp_eflags;
    int old_iter_limit;
!   static char qindex[NUMQ] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
!   char *qp;
  
    if (!buff || !bp || !str || !*str)
      return;
--- 322,328 ----
    char temp[3];
    int temp_eflags;
    int old_iter_limit;
!   int qindex;
  
    if (!buff || !bp || !str || !*str)
      return;
***************
*** 566,579 ****
  	  if (!nextc)
  	    goto exit_sequence;
  	  (*str)++;
! 	  if (!(qp = strchr(qindex, UPCASE(nextc))))
  	    break;
! 	  if (renv[qp - qindex])
! 	    safe_str(renv[qp - qindex], buff, bp);
  	  break;
  	case 'R':
  	case 'r':		/* newline */
! 	  safe_str("\r\n", buff, bp);
  	  break;
  	case 'S':
  	case 's':		/* enactor subjective pronoun */
--- 553,569 ----
  	  if (!nextc)
  	    goto exit_sequence;
  	  (*str)++;
! 	  if ((qindex = qreg_indexes[(unsigned char) nextc]) == -1)
  	    break;
! 	  if (renv[qindex])
! 	    safe_str(renv[qindex], buff, bp);
  	  break;
  	case 'R':
  	case 'r':		/* newline */
! 	  if (NEWLINE_ONE_CHAR)
! 	    safe_chr('\n', buff, bp);
! 	  else
! 	    safe_str("\r\n", buff, bp);
  	  break;
  	case 'S':
  	case 's':		/* enactor subjective pronoun */
*** 1_7_4.101/src/move.c Mon, 11 Jun 2001 10:50:03 -0500 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.3 660)
--- 1_7_4.129(w)/src/move.c Tue, 10 Jul 2001 14:23:20 -0500 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.5 660)
***************
*** 60,65 ****
--- 60,69 ----
    dbref loc, old;
    dbref absloc, absold;
  
+   /* Don't move something into something it's holding */
+   if (recursive_member(where, what, 0))
+     return;
+ 
    /* remove what from old loc */
    absold = absolute_room(what);
    if ((loc = old = Location(what)) != NOTHING) {
***************
*** 210,215 ****
--- 214,226 ----
      deep--;
      return;
    }
+   if (recursive_member(loc, player, 0)) {
+     do_rawlog(LT_ERR,
+ 	      T("ERROR: Attempt to move player %d into carried object %d\n"),
+ 	      player, loc);
+     deep--;
+     return;
+   }
    /* get old location */
    old = Location(player);
  
***************
*** 484,490 ****
    dbref loc = Location(player);
    dbref thing;
    char tbuf1[BUFFER_LEN];
!   long match_flags = MAT_NEIGHBOR | MAT_ABSOLUTE | MAT_CHECK_KEYS | MAT_NEAR | MAT_ENGLISH;
    char *myenv[10];
    int i;
  
--- 495,502 ----
    dbref loc = Location(player);
    dbref thing;
    char tbuf1[BUFFER_LEN];
!   long match_flags =
!     MAT_NEIGHBOR | MAT_ABSOLUTE | MAT_CHECK_KEYS | MAT_NEAR | MAT_ENGLISH;
    char *myenv[10];
    int i;
  
***************
*** 599,605 ****
  
    switch (thing =
  	  match_result(player, name, TYPE_THING,
! 		       MAT_POSSESSION | MAT_ABSOLUTE | MAT_CONTROL | MAT_ENGLISH)) {
    case NOTHING:
      notify(player, T("You don't have that!"));
      return;
--- 611,618 ----
  
    switch (thing =
  	  match_result(player, name, TYPE_THING,
! 		       MAT_POSSESSION | MAT_ABSOLUTE | MAT_CONTROL |
! 		       MAT_ENGLISH)) {
    case NOTHING:
      notify(player, T("You don't have that!"));
      return;
*** 1_7_4.101/src/memcheck.c Mon, 20 Nov 2000 09:55:52 -0600 dunemush (pennmush/c/1_memcheck.c 1.8 660)
--- 1_7_4.129(w)/src/memcheck.c Tue, 10 Jul 2001 14:23:20 -0500 dunemush (pennmush/c/1_memcheck.c 1.8.1.1 660)
***************
*** 96,102 ****
    MEM *loop;
  
    for (loop = my_check; loop; loop = loop->next) {
!     notify(player, tprintf("%s : %d", loop->ref_name, loop->ref_count));
    }
  }
  
--- 96,102 ----
    MEM *loop;
  
    for (loop = my_check; loop; loop = loop->next) {
!     notify_format(player, "%s : %d", loop->ref_name, loop->ref_count);
    }
  }
  
*** 1_7_4.101/src/match.c Sat, 07 Apr 2001 09:38:06 -0500 dunemush (pennmush/c/2_match.c 1.20 660)
--- 1_7_4.129(w)/src/match.c Tue, 10 Jul 2001 14:23:20 -0500 dunemush (pennmush/c/2_match.c 1.22 660)
***************
*** 71,77 ****
  static dbref match_me _((const dbref who, const char *name));
  static dbref match_here _((const dbref who, const char *name));
  static dbref match_absolute _((const char *name));
! static dbref match_player _((const char *match_name));
  static dbref match_list _((const dbref match_who, const char *match_name,
  			   const int type, const long int flags, dbref first,
  			   dbref *last_match, int *match_count));
--- 71,77 ----
  static dbref match_me _((const dbref who, const char *name));
  static dbref match_here _((const dbref who, const char *name));
  static dbref match_absolute _((const char *name));
! static dbref match_player _((const dbref matcher, const char *match_name));
  static dbref match_list _((const dbref match_who, const char *match_name,
  			   const int type, const long int flags, dbref first,
  			   dbref *last_match, int *match_count));
***************
*** 191,197 ****
        }
      }
      if (flags & MAT_PLAYER) {
!       match = match_player(name);
        if (GoodObject(match))
  	return match;
      }
--- 191,197 ----
        }
      }
      if (flags & MAT_PLAYER) {
!       match = match_player(who, name);
        if (GoodObject(match))
  	return match;
      }
***************
*** 326,332 ****
  }
  
  static dbref
! match_player(match_name)
      const char *match_name;
  {
    dbref match;
--- 326,333 ----
  }
  
  static dbref
! match_player(matcher, match_name)
!     const dbref matcher;
      const char *match_name;
  {
    dbref match;
***************
*** 340,346 ****
      } else {
        /* try a partial match on a connected player, 2.0 style */
        /* Can return a match, NOTHING, or AMBIGUOUS */
!       return short_page(p);
      }
    }
    return NOTHING;
--- 341,347 ----
      } else {
        /* try a partial match on a connected player, 2.0 style */
        /* Can return a match, NOTHING, or AMBIGUOUS */
!       return visible_short_page(matcher, p);
      }
    }
    return NOTHING;
***************
*** 540,545 ****
--- 541,547 ----
    int do_loc;
    int do_cont;
    int num, matchnum;
+   char *dupname, *p;
    char *mname;
    char *e;
    dbref item;
***************
*** 547,552 ****
--- 549,555 ----
    if (!Mobile(who))
      return NOTHING;
  
+   p = dupname = mush_strdup(name, "string");
    if (flags & MAT_NEIGHBOR)
      do_loc = 1;
    else
***************
*** 556,584 ****
    else
      do_cont = 0;
  
!   if (do_loc && (!strncasecmp(name, "this here ", 10))) {
!     name += 10;
      do_cont = 0;
!   } else if (do_loc && (!strncasecmp(name, "here ", 5)
! 			|| !strncasecmp(name, "this ", 5))) {
!     name += 5;
      do_cont = 0;
!   } else if (do_cont && (!strncasecmp(name, "my ", 3)
! 			 || !strncasecmp(name, "me ", 3))) {
!     name += 3;
      do_loc = 0;
    }
  
!   while (*name == ' ')
!     name++;
  
!   if (!*name)
      return NOTHING;
  
!   mname = strchr(name, ' ');
    if (mname) {
      *mname = '\0';
!     num = strtoul(name, &e, 10);
      if (e && *e) {
        if (num < 1) {
  	num = -1;
--- 559,589 ----
    else
      do_cont = 0;
  
!   if (do_loc && (!strncasecmp(dupname, "this here ", 10))) {
!     dupname += 10;
      do_cont = 0;
!   } else if (do_loc && (!strncasecmp(dupname, "here ", 5)
! 			|| !strncasecmp(dupname, "this ", 5))) {
!     dupname += 5;
      do_cont = 0;
!   } else if (do_cont && (!strncasecmp(dupname, "my ", 3)
! 			 || !strncasecmp(dupname, "me ", 3))) {
!     dupname += 3;
      do_loc = 0;
    }
  
!   while (*dupname == ' ')
!     dupname++;
  
!   if (!*dupname) {
!     mush_free(p, "string");
      return NOTHING;
+   }
  
!   mname = strchr(dupname, ' ');
    if (mname) {
      *mname = '\0';
!     num = strtoul(dupname, &e, 10);
      if (e && *e) {
        if (num < 1) {
  	num = -1;
***************
*** 600,608 ****
      }
  
      if (num != -1) {
!       name = mname + 1;
!       while (*name == ' ')
! 	name++;
      } else {
        num = 1;
        *mname = ' ';
--- 605,613 ----
      }
  
      if (num != -1) {
!       dupname = mname + 1;
!       while (*dupname == ' ')
! 	dupname++;
      } else {
        num = 1;
        *mname = ' ';
***************
*** 622,636 ****
      matchnum = 0;
      DOLIST(item, item) {
        if ((Typeof(item) & type)
! 	  && (!strcasecmp(Name(item), name)
! 	      || string_match(Name(item), name))) {
  	matchnum++;
  	if (matchnum == num) {
  	  return item;
  	}
        }
      }
    }
    return NOTHING;
  }
  
--- 627,643 ----
      matchnum = 0;
      DOLIST(item, item) {
        if ((Typeof(item) & type)
! 	  && (!strcasecmp(Name(item), dupname)
! 	      || string_match(Name(item), dupname))) {
  	matchnum++;
  	if (matchnum == num) {
+ 	  mush_free(p, "string");
  	  return item;
  	}
        }
      }
    }
+   mush_free(p, "string");
    return NOTHING;
  }
  
*** 1_7_4.101/src/malias.c Fri, 25 May 2001 11:53:48 -0500 dunemush (pennmush/c/3_malias.c 1.31 660)
--- 1_7_4.129(w)/src/malias.c Tue, 10 Jul 2001 14:23:20 -0500 dunemush (pennmush/c/3_malias.c 1.32 660)
***************
*** 134,142 ****
      return;
    }
    if (*alias != MALIAS_TOKEN) {
!     notify(player,
! 	   tprintf(T("MAIL: All Mail aliases must begin with '%c'."),
! 		   MALIAS_TOKEN));
      return;
    }
    good = "`$_-.'";
--- 134,142 ----
      return;
    }
    if (*alias != MALIAS_TOKEN) {
!     notify_format(player,
! 		  T("MAIL: All Mail aliases must begin with '%c'."),
! 		  MALIAS_TOKEN);
      return;
    }
    good = "`$_-.'";
***************
*** 151,157 ****
    }
    m = get_malias(GOD, alias);	/* GOD can see all aliases */
    if (m) {			/* Ensures no duplicates!  */
!     notify(player, tprintf(T("MAIL: Mail Alias '%s' already exists."), alias));
      return;
    }
    if (!ma_size) {
--- 151,157 ----
    }
    m = get_malias(GOD, alias);	/* GOD can see all aliases */
    if (m) {			/* Ensures no duplicates!  */
!     notify_format(player, T("MAIL: Mail Alias '%s' already exists."), alias);
      return;
    }
    if (!ma_size) {
***************
*** 203,212 ****
      } else
        target = lookup_player(head);
      if (!(GoodObject(target)) || (!IsPlayer(target))) {
!       notify(player, tprintf(T("MAIL: No such player '%s'."), head));
      } else {
        buff = unparse_object(player, target);
!       notify(player, tprintf(T("MAIL: %s added to alias %s"), buff, alias));
        alist[i] = target;
        i++;
      }
--- 203,212 ----
      } else
        target = lookup_player(head);
      if (!(GoodObject(target)) || (!IsPlayer(target))) {
!       notify_format(player, T("MAIL: No such player '%s'."), head);
      } else {
        buff = unparse_object(player, target);
!       notify_format(player, T("MAIL: %s added to alias %s"), buff, alias);
        alist[i] = target;
        i++;
      }
***************
*** 245,251 ****
    ma_top++;
  
  
!   notify(player, tprintf(T("MAIL: Alias set '%s' defined."), alias));
  }
  
  
--- 245,251 ----
    ma_top++;
  
  
!   notify_format(player, T("MAIL: Alias set '%s' defined."), alias);
  }
  
  
***************
*** 264,278 ****
  	((m->nflags & ALIAS_ADMIN) && Hasprivs(player)) ||
  	((m->nflags & ALIAS_MEMBERS) && ismember(m, player))) {
        if (!notified) {
! 	notify(player, tprintf("%-13s %-35s %s %-15s",
! 			       T("Name"), T("Alias Description"), T("Use See"),
! 			       T("Owner")));
  	notified++;
        }
!       notify(player,
! 	     tprintf("%c%-12.12s %-35.35s %s %-15.15s", MALIAS_TOKEN, m->name,
! 		     uncompress((unsigned char *) (m->desc)), get_shortprivs(m),
! 		     Name(m->owner)));
      }
    }
  
--- 264,278 ----
  	((m->nflags & ALIAS_ADMIN) && Hasprivs(player)) ||
  	((m->nflags & ALIAS_MEMBERS) && ismember(m, player))) {
        if (!notified) {
! 	notify_format(player, "%-13s %-35s %s %-15s",
! 		      T("Name"), T("Alias Description"), T("Use See"),
! 		      T("Owner"));
  	notified++;
        }
!       notify_format(player,
! 		    "%c%-12.12s %-35.35s %s %-15.15s", MALIAS_TOKEN, m->name,
! 		    uncompress((unsigned char *) (m->desc)), get_shortprivs(m),
! 		    Name(m->owner));
      }
    }
  
***************
*** 292,298 ****
    m = get_malias(player, alias);
  
    if (!m) {
!     notify(player, tprintf(T("MAIL: Alias '%s' not found."), alias));
      return;
    }
    if ((m->owner == player) || (m->mflags == 0) ||
--- 292,298 ----
    m = get_malias(player, alias);
  
    if (!m) {
!     notify_format(player, T("MAIL: Alias '%s' not found."), alias);
      return;
    }
    if ((m->owner == player) || (m->mflags == 0) ||
***************
*** 325,331 ****
    struct mail_alias *m;
  
    if (!(m = get_malias(player, alias))) {
!     notify(player, tprintf(T("MAIL: Alias %s not found."), alias));
      return;
    } else if (Wizard(player) || (player == m->owner)) {
      if (m->desc)
--- 325,331 ----
    struct mail_alias *m;
  
    if (!(m = get_malias(player, alias))) {
!     notify_format(player, T("MAIL: Alias %s not found."), alias);
      return;
    } else if (Wizard(player) || (player == m->owner)) {
      if (m->desc)
***************
*** 348,354 ****
    dbref no = NOTHING;
  
    if (!(m = get_malias(player, alias))) {
!     notify(player, tprintf(T("MAIL: Alias %s not found."), alias));
      return;
    } else {
      if (!Wizard(player)) {
--- 348,354 ----
    dbref no = NOTHING;
  
    if (!(m = get_malias(player, alias))) {
!     notify_format(player, T("MAIL: Alias %s not found."), alias);
      return;
    } else {
      if (!Wizard(player)) {
***************
*** 380,388 ****
      return;
    }
    if (*newname != MALIAS_TOKEN) {
!     notify(player,
! 	   tprintf(T("MAIL: Bad alias. Aliases must start with '%c'."),
! 		   MALIAS_TOKEN));
      return;
    }
    if (get_malias(GOD, newname) != NULL) {
--- 380,388 ----
      return;
    }
    if (*newname != MALIAS_TOKEN) {
!     notify_format(player,
! 		  T("MAIL: Bad alias. Aliases must start with '%c'."),
! 		  MALIAS_TOKEN);
      return;
    }
    if (get_malias(GOD, newname) != NULL) {
***************
*** 493,502 ****
      } else
        target = lookup_player(head);
      if (!(GoodObject(target)) || (!IsPlayer(target))) {
!       notify(player, tprintf(T("MAIL: No such player '%s'."), head));
      } else {
        buff = unparse_object(player, target);
!       notify(player, tprintf(T("MAIL: %s added to alias %s"), buff, alias));
        alist[i] = target;
        i++;
      }
--- 493,502 ----
      } else
        target = lookup_player(head);
      if (!(GoodObject(target)) || (!IsPlayer(target))) {
!       notify_format(player, T("MAIL: No such player '%s'."), head);
      } else {
        buff = unparse_object(player, target);
!       notify_format(player, T("MAIL: %s added to alias %s"), buff, alias);
        alist[i] = target;
        i++;
      }
***************
*** 563,571 ****
    if (!Hasprivs(player))
      notify(player, T("MAIL: Permission denied."));
    else {
!     notify(player,
! 	   tprintf(T("MAIL: Number of mail aliases defined: %d"), ma_top));
!     notify(player, tprintf(T("MAIL: Allocated slots %d"), ma_size));
    }
  }
  
--- 563,571 ----
    if (!Hasprivs(player))
      notify(player, T("MAIL: Permission denied."));
    else {
!     notify_format(player,
! 		  T("MAIL: Number of mail aliases defined: %d"), ma_top);
!     notify_format(player, T("MAIL: Allocated slots %d"), ma_size);
    }
  }
  
***************
*** 618,626 ****
    }
    p = type ? &m->mflags : &m->nflags;
    *p = string_to_privs(malias_priv_table, privs, 0);
!   notify(player,
! 	 tprintf(T("MAIL: Permission to see/use alias '%s' changed to %s"),
! 		 alias, privs_to_string(malias_priv_table, *p)));
  }
  
  
--- 618,626 ----
    }
    p = type ? &m->mflags : &m->nflags;
    *p = string_to_privs(malias_priv_table, privs, 0);
!   notify_format(player,
! 		T("MAIL: Permission to see/use alias '%s' changed to %s"),
! 		alias, privs_to_string(malias_priv_table, *p));
  }
  
  
***************
*** 651,658 ****
    }
    ch = strstr(TYPES, tprintf(" %s", privs + 1));
    if (!ch) {
!     notify(player,
! 	   tprintf(T("MAIL: Unknown permission type '%s'."), privs + 1));
      notify(player,
  	   T
  	   ("Must be one of 'everyone', 'members', 'admin', 'owner' (can be abbreviated)."));
--- 651,657 ----
    }
    ch = strstr(TYPES, tprintf(" %s", privs + 1));
    if (!ch) {
!     notify_format(player, T("MAIL: Unknown permission type '%s'."), privs + 1);
      notify(player,
  	   T
  	   ("Must be one of 'everyone', 'members', 'admin', 'owner' (can be abbreviated)."));
***************
*** 688,696 ****
      if (!m->mflags)
        m->mflags = ALIAS_OWNER;
    }
!   notify(player,
! 	 tprintf(T("MAIL: Permission to list alias '%s' changed to %s"),
! 		 alias, get_privs(m->mflags)));
  }
  
  
--- 687,695 ----
      if (!m->mflags)
        m->mflags = ALIAS_OWNER;
    }
!   notify_format(player,
! 		T("MAIL: Permission to list alias '%s' changed to %s"),
! 		alias, get_privs(m->mflags));
  }
  
  
***************
*** 712,718 ****
  
    m = get_malias(player, alias);
    if (!m) {
!     notify(player, tprintf(T("MAIL: Mail Alias '%s' not found."), alias));
      return;
    }
    if (!Wizard(player) && (m->owner != player)) {
--- 711,717 ----
  
    m = get_malias(player, alias);
    if (!m) {
!     notify_format(player, T("MAIL: Mail Alias '%s' not found."), alias);
      return;
    }
    if (!Wizard(player) && (m->owner != player)) {
***************
*** 754,768 ****
      } else
        target = lookup_player(head);
      if (!(GoodObject(target)) || (!IsPlayer(target))) {
!       notify(player, tprintf(T("MAIL: No such player '%s'."), head));
      } else {
        if (ismember(m, target)) {
! 	notify(player,
! 	       tprintf(T("MAIL: player '%s' exists already in alias %s."),
! 		       head, alias));
        } else {
  	buff = unparse_object(player, target);
! 	notify(player, tprintf(T("MAIL: %s added to alias %s"), buff, alias));
  	alist[i] = target;
  	i++;
        }
--- 753,767 ----
      } else
        target = lookup_player(head);
      if (!(GoodObject(target)) || (!IsPlayer(target))) {
!       notify_format(player, T("MAIL: No such player '%s'."), head);
      } else {
        if (ismember(m, target)) {
! 	notify_format(player,
! 		      T("MAIL: player '%s' exists already in alias %s."),
! 		      head, alias);
        } else {
  	buff = unparse_object(player, target);
! 	notify_format(player, T("MAIL: %s added to alias %s"), buff, alias);
  	alist[i] = target;
  	i++;
        }
***************
*** 795,801 ****
  
    m->size += i;
  
!   notify(player, tprintf(T("MAIL: Alias set '%s' redefined."), alias));
  }
  
  
--- 794,800 ----
  
    m->size += i;
  
!   notify_format(player, T("MAIL: Alias set '%s' redefined."), alias);
  }
  
  
***************
*** 816,822 ****
  
    m = get_malias(player, alias);
    if (!m) {
!     notify(player, tprintf(T("MAIL: Mail Alias '%s' not found."), alias));
      return;
    }
    if (!Wizard(player) && (m->owner != player)) {
--- 815,821 ----
  
    m = get_malias(player, alias);
    if (!m) {
!     notify_format(player, T("MAIL: Mail Alias '%s' not found."), alias);
      return;
    }
    if (!Wizard(player) && (m->owner != player)) {
***************
*** 858,873 ****
      } else
        target = lookup_player(head);
      if (!(GoodObject(target)) || (!IsPlayer(target))) {
!       notify(player, tprintf(T("MAIL: No such player '%s'."), head));
      } else {
        if (!(i = ismember(m, target))) {
! 	notify(player, tprintf(T("MAIL: player '%s' is not in alias %s."),
! 			       head, alias));
        } else {
  	buff = unparse_object(player, target);
  	m->members[i - 1] = m->members[--m->size];
! 	notify(player,
! 	       tprintf(T("MAIL: %s removed from alias %s"), buff, alias));
        }
      }
      /*
--- 857,871 ----
      } else
        target = lookup_player(head);
      if (!(GoodObject(target)) || (!IsPlayer(target))) {
!       notify_format(player, T("MAIL: No such player '%s'."), head);
      } else {
        if (!(i = ismember(m, target))) {
! 	notify_format(player, T("MAIL: player '%s' is not in alias %s."),
! 		      head, alias);
        } else {
  	buff = unparse_object(player, target);
  	m->members[i - 1] = m->members[--m->size];
! 	notify_format(player, T("MAIL: %s removed from alias %s"), buff, alias);
        }
      }
      /*
***************
*** 879,885 ****
        head++;
    }
  
!   notify(player, tprintf(T("MAIL: Alias set '%s' redefined."), alias));
  }
  
  
--- 877,883 ----
        head++;
    }
  
!   notify_format(player, T("MAIL: Alias set '%s' redefined."), alias);
  }
  
  
*** 1_7_4.101/src/look.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/c/4_look.c 1.21.1.1 660)
--- 1_7_4.129(w)/src/look.c Tue, 10 Jul 2001 14:23:20 -0500 dunemush (pennmush/c/4_look.c 1.21.1.2 660)
***************
*** 190,206 ****
  	safe_tag("LI", tbuf1, &s1);
  	safe_chr(' ', tbuf1, &s1);
  	if (Location(thing) == NOTHING)
! 	  safe_str(tprintf(T("%s leads nowhere."), nbuf), tbuf1, &s1);
  	else if (Location(thing) == HOME)
! 	  safe_str(tprintf(T("%s leads home."), nbuf), tbuf1, &s1);
  	else if (Location(thing) == AMBIGUOUS)
! 	  safe_str(tprintf(T("%s leads to a variable location."), nbuf), tbuf1,
! 		   &s1);
  	else if (!GoodObject(thing))
! 	  safe_str(tprintf(T("%s is corrupt!"), nbuf), tbuf1, &s1);
  	else {
! 	  safe_str(tprintf(T("%s leads to %s."), nbuf, Name(Location(thing))),
! 		   tbuf1, &s1);
  	}
  	*s1 = '\0';
  	notify_nopenter_by(loc, player, tbuf1);
--- 190,205 ----
  	safe_tag("LI", tbuf1, &s1);
  	safe_chr(' ', tbuf1, &s1);
  	if (Location(thing) == NOTHING)
! 	  safe_format(tbuf1, &s1, T("%s leads nowhere."), nbuf);
  	else if (Location(thing) == HOME)
! 	  safe_format(tbuf1, &s1, T("%s leads home."), nbuf);
  	else if (Location(thing) == AMBIGUOUS)
! 	  safe_format(tbuf1, &s1, T("%s leads to a variable location."), nbuf);
  	else if (!GoodObject(thing))
! 	  safe_format(tbuf1, &s1, T("%s is corrupt!"), nbuf);
  	else {
! 	  safe_format(tbuf1, &s1, T("%s leads to %s."), nbuf,
! 		      Name(Location(thing)));
  	}
  	*s1 = '\0';
  	notify_nopenter_by(loc, player, tbuf1);
***************
*** 346,377 ****
    if (TINY_ATTRS) {
      if (ShowAnsi(player)) {
        if (Owner(AL_CREATOR(atr)) != Owner(thing))
! 	notify(player,
! 	       tprintf("%s%s(#%d%s):%s%s", ANSI_HILITE, AL_NAME(atr),
! 		       Owner(AL_CREATOR(atr)), fbuf, ANSI_NORMAL, r));
        else if (*fbuf != '\0')
! 	notify(player, tprintf("%s%s(%s):%s%s", ANSI_HILITE, AL_NAME(atr),
! 			       fbuf, ANSI_NORMAL, r));
        else
! 	notify(player, tprintf("%s%s:%s%s", ANSI_HILITE, AL_NAME(atr),
! 			       ANSI_NORMAL, r));
      } else {
        if (Owner(AL_CREATOR(atr)) != Owner(thing))
! 	notify(player, tprintf("%s(#%d%s):%s", AL_NAME(atr),
! 			       Owner(AL_CREATOR(atr)), fbuf, r));
        else if (*fbuf != '\0')
! 	notify(player, tprintf("%s(%s):%s", AL_NAME(atr), fbuf, r));
        else
! 	notify(player, tprintf("%s:%s", AL_NAME(atr), r));
      }
    } else {
      if (ShowAnsi(player)) {
!       notify(player,
! 	     tprintf("%s%s [#%d%s]:%s %s", ANSI_HILITE, AL_NAME(atr),
! 		     Owner(AL_CREATOR(atr)), fbuf, ANSI_NORMAL, r));
      } else {
!       notify(player, tprintf("%s [#%d%s]: %s", AL_NAME(atr),
! 			     Owner(AL_CREATOR(atr)), fbuf, r));
      }
    }
    free((Malloc_t) r);
--- 345,376 ----
    if (TINY_ATTRS) {
      if (ShowAnsi(player)) {
        if (Owner(AL_CREATOR(atr)) != Owner(thing))
! 	notify_format(player,
! 		      "%s%s(#%d%s):%s%s", ANSI_HILITE, AL_NAME(atr),
! 		      Owner(AL_CREATOR(atr)), fbuf, ANSI_NORMAL, r);
        else if (*fbuf != '\0')
! 	notify_format(player, "%s%s(%s):%s%s", ANSI_HILITE, AL_NAME(atr),
! 		      fbuf, ANSI_NORMAL, r);
        else
! 	notify_format(player, "%s%s:%s%s", ANSI_HILITE, AL_NAME(atr),
! 		      ANSI_NORMAL, r);
      } else {
        if (Owner(AL_CREATOR(atr)) != Owner(thing))
! 	notify_format(player, "%s(#%d%s):%s", AL_NAME(atr),
! 		      Owner(AL_CREATOR(atr)), fbuf, r);
        else if (*fbuf != '\0')
! 	notify_format(player, "%s(%s):%s", AL_NAME(atr), fbuf, r);
        else
! 	notify_format(player, "%s:%s", AL_NAME(atr), r);
      }
    } else {
      if (ShowAnsi(player)) {
!       notify_format(player,
! 		    "%s%s [#%d%s]:%s %s", ANSI_HILITE, AL_NAME(atr),
! 		    Owner(AL_CREATOR(atr)), fbuf, ANSI_NORMAL, r);
      } else {
!       notify_format(player, "%s [#%d%s]: %s", AL_NAME(atr),
! 		    Owner(AL_CREATOR(atr)), fbuf, r);
      }
    }
    free((Malloc_t) r);
***************
*** 701,721 ****
      }
    }
    if (ok) {
!     notify(player,
! 	   tprintf(T("Owner: %s  Zone: %s  %s: %d"),
! 		   Name(Owner(thing)),
! 		   object_header(player, Zone(thing)), MONIES, Pennies(thing)));
!     notify(player,
! 	   tprintf(T("Parent: %s"), object_header(player, Parent(thing))));
      {
        struct lock_list *ll;
        for (ll = Locks(thing); ll; ll = ll->next) {
! 	notify(player,
! 	       tprintf(T("%s Lock: %s"),
! 		       ll->type, unparse_boolexp(player, ll->key, 0)));
        }
      }
!     notify(player, tprintf(T("Powers: %s"), power_description(thing)));
  
  #ifdef CHAT_SYSTEM
      if (IsPlayer(thing) || Chanlist(thing))
--- 700,719 ----
      }
    }
    if (ok) {
!     notify_format(player,
! 		  T("Owner: %s  Zone: %s  %s: %d"),
! 		  Name(Owner(thing)),
! 		  object_header(player, Zone(thing)), MONIES, Pennies(thing));
!     notify_format(player,
! 		  T("Parent: %s"), object_header(player, Parent(thing)));
      {
        struct lock_list *ll;
        for (ll = Locks(thing); ll; ll = ll->next) {
! 	notify_format(player, T("%s Lock: %s"),
! 		      ll->type, unparse_boolexp(player, ll->key, 0));
        }
      }
!     notify_format(player, T("Powers: %s"), power_description(thing));
  
  #ifdef CHAT_SYSTEM
      if (IsPlayer(thing) || Chanlist(thing))
***************
*** 723,739 ****
  #endif				/* CHAT_SYSTEM */
  
  #ifdef USE_WARNINGS
!     notify(player, tprintf(T("Warnings checked: %s"), unparse_warnings(thing)));
  #endif
  
  #ifdef CREATION_TIMES
      tp = (char *) ctime(&CreTime(thing));
      tp[strlen(tp) - 1] = '\0';
!     notify(player, tprintf(T("Created: %s"), tp));
      if (!IsPlayer(thing)) {
        tp = (char *) ctime(&ModTime(thing));
        tp[strlen(tp) - 1] = '\0';
!       notify(player, tprintf(T("Last Modification: %s"), tp));
      }
  #endif
    }
--- 721,737 ----
  #endif				/* CHAT_SYSTEM */
  
  #ifdef USE_WARNINGS
!     notify_format(player, T("Warnings checked: %s"), unparse_warnings(thing));
  #endif
  
  #ifdef CREATION_TIMES
      tp = (char *) ctime(&CreTime(thing));
      tp[strlen(tp) - 1] = '\0';
!     notify_format(player, T("Created: %s"), tp);
      if (!IsPlayer(thing)) {
        tp = (char *) ctime(&ModTime(thing));
        tp[strlen(tp) - 1] = '\0';
!       notify_format(player, T("Last Modification: %s"), tp);
      }
  #endif
    }
***************
*** 778,797 ****
        notify(player, T("No exits."));
      /* print dropto if present */
      if (Location(thing) != NOTHING) {
!       notify(player,
! 	     tprintf(T("Dropped objects go to: %s"),
! 		     object_header(player, Location(thing))));
      }
      break;
    case TYPE_THING:
    case TYPE_PLAYER:
      /* print home */
!     notify(player, tprintf(T("Home: %s"), object_header(player, Home(thing))));	/* home */
      /* print location if player can link to it */
      if (Location(thing) != NOTHING)
!       notify(player,
! 	     tprintf(T("Location: %s"),
! 		     object_header(player, Location(thing))));
      break;
    case TYPE_EXIT:
      /* print source */
--- 776,794 ----
        notify(player, T("No exits."));
      /* print dropto if present */
      if (Location(thing) != NOTHING) {
!       notify_format(player,
! 		    T("Dropped objects go to: %s"),
! 		    object_header(player, Location(thing)));
      }
      break;
    case TYPE_THING:
    case TYPE_PLAYER:
      /* print home */
!     notify_format(player, T("Home: %s"), object_header(player, Home(thing)));	/* home */
      /* print location if player can link to it */
      if (Location(thing) != NOTHING)
!       notify_format(player,
! 		    T("Location: %s"), object_header(player, Location(thing)));
      break;
    case TYPE_EXIT:
      /* print source */
***************
*** 813,820 ****
  		Name(thing), thing, Destination(thing));
        break;
      default:
!       notify(player,
! 	     tprintf(T("Source: %s"), object_header(player, Source(thing))));
        break;
      }
      /* print destination */
--- 810,817 ----
  		Name(thing), thing, Destination(thing));
        break;
      default:
!       notify_format(player,
! 		    T("Source: %s"), object_header(player, Source(thing)));
        break;
      }
      /* print destination */
***************
*** 826,834 ****
        notify(player, T("Destination: *HOME*"));
        break;
      default:
!       notify(player,
! 	     tprintf(T("Destination: %s"),
! 		     object_header(player, Destination(thing))));
        break;
      }
      break;
--- 823,831 ----
        notify(player, T("Destination: *HOME*"));
        break;
      default:
!       notify_format(player,
! 		    T("Destination: %s"),
! 		    object_header(player, Destination(thing)));
        break;
      }
      break;
***************
*** 844,852 ****
      dbref player;
  {
  
!   notify(player,
! 	 tprintf(T("You have %d %s."),
! 		 Pennies(player), Pennies(player) == 1 ? MONEY : MONIES));
  }
  
  void
--- 841,849 ----
      dbref player;
  {
  
!   notify_format(player,
! 		T("You have %d %s."),
! 		Pennies(player), Pennies(player) == 1 ? MONEY : MONIES);
  }
  
  void
***************
*** 878,885 ****
    int top = db_top;
  
    if (!payfor(player, FIND_COST)) {
!     notify(player, tprintf(T("Finds cost %d %s."), FIND_COST,
! 			   ((FIND_COST == 1) ? MONEY : MONIES)));
      return;
    }
    /* determinte range */
--- 875,882 ----
    int top = db_top;
  
    if (!payfor(player, FIND_COST)) {
!     notify_format(player, T("Finds cost %d %s."), FIND_COST,
! 		  ((FIND_COST == 1) ? MONEY : MONIES));
      return;
    }
    /* determinte range */
***************
*** 911,917 ****
        count++;
      }
    }
!   notify(player, tprintf(T("*** %d objects found ***"), count));
  }
  
  /* check the current location for bugs */
--- 908,914 ----
        count++;
      }
    }
!   notify_format(player, T("*** %d objects found ***"), count);
  }
  
  /* check the current location for bugs */
***************
*** 952,976 ****
        /* only worry about puppet and players who's owner's are connected */
        if (Connected(here) || (Puppet(here) && Connected(Owner(here)))) {
  	if (IsPlayer(here)) {
! 	  notify(player, tprintf(T("%s is listening"), Name(here)));
  	} else {
! 	  notify(player, tprintf(T("%s [owner: %s] is listening."),
! 				 Name(here), Name(Owner(here))));
  	}
        }
      } else {
        if (Hearer(here) || Listener(here)) {
  	if (Connected(here))
! 	  notify(player, tprintf(T("%s (this room) [speech]. (connected)"),
! 				 Name(here)));
  	else
! 	  notify(player, tprintf(T("%s (this room) [speech]."), Name(here)));
        }
        if (Commer(here))
! 	notify(player, tprintf(T("%s (this room) [commands]."), Name(here)));
        if (Audible(here))
! 	notify(player,
! 	       tprintf(T("%s (this room) [broadcasting]."), Name(here)));
      }
  
      for (here = Contents(here); here != NOTHING; here = Next(here)) {
--- 949,972 ----
        /* only worry about puppet and players who's owner's are connected */
        if (Connected(here) || (Puppet(here) && Connected(Owner(here)))) {
  	if (IsPlayer(here)) {
! 	  notify_format(player, T("%s is listening"), Name(here));
  	} else {
! 	  notify_format(player, T("%s [owner: %s] is listening."),
! 			Name(here), Name(Owner(here)));
  	}
        }
      } else {
        if (Hearer(here) || Listener(here)) {
  	if (Connected(here))
! 	  notify_format(player, T("%s (this room) [speech]. (connected)"),
! 			Name(here));
  	else
! 	  notify_format(player, T("%s (this room) [speech]."), Name(here));
        }
        if (Commer(here))
! 	notify_format(player, T("%s (this room) [commands]."), Name(here));
        if (Audible(here))
! 	notify_format(player, T("%s (this room) [broadcasting]."), Name(here));
      }
  
      for (here = Contents(here); here != NOTHING; here = Next(here)) {
***************
*** 978,998 ****
  	/* only worry about puppet and players who's owner's are connected */
  	if (Connected(here) || (Puppet(here) && Connected(Owner(here)))) {
  	  if (IsPlayer(here)) {
! 	    notify(player, tprintf(T("%s is listening"), Name(here)));
  	  } else {
! 	    notify(player, tprintf(T("%s [owner: %s] is listening."),
! 				   Name(here), Name(Owner(here))));
  	  }
  	}
        } else {
  	if (Hearer(here) || Listener(here)) {
  	  if (Connected(here))
! 	    notify(player, tprintf("%s [speech]. (connected)", Name(here)));
  	  else
! 	    notify(player, tprintf("%s [speech].", Name(here)));
  	}
  	if (Commer(here))
! 	  notify(player, tprintf("%s [commands].", Name(here)));
        }
      }
    }
--- 974,994 ----
  	/* only worry about puppet and players who's owner's are connected */
  	if (Connected(here) || (Puppet(here) && Connected(Owner(here)))) {
  	  if (IsPlayer(here)) {
! 	    notify_format(player, T("%s is listening"), Name(here));
  	  } else {
! 	    notify_format(player, T("%s [owner: %s] is listening."),
! 			  Name(here), Name(Owner(here)));
  	  }
  	}
        } else {
  	if (Hearer(here) || Listener(here)) {
  	  if (Connected(here))
! 	    notify_format(player, "%s [speech]. (connected)", Name(here));
  	  else
! 	    notify_format(player, "%s [speech].", Name(here));
  	}
  	if (Commer(here))
! 	  notify_format(player, "%s [commands].", Name(here));
        }
      }
    }
***************
*** 1005,1011 ****
  	  strcpy(tbuf1, Name(here));
  	  for (p = tbuf1; *p && (*p != ';'); p++) ;
  	  *p = '\0';
! 	  notify(player, tprintf("%s [broadcasting].", tbuf1));
  	}
        }
      }
--- 1001,1007 ----
  	  strcpy(tbuf1, Name(here));
  	  for (p = tbuf1; *p && (*p != ';'); p++) ;
  	  *p = '\0';
! 	  notify_format(player, "%s [broadcasting].", tbuf1);
  	}
        }
      }
***************
*** 1018,1038 ****
  	/* only worry about puppet and players who's owner's are connected */
  	if (Connected(here) || (Puppet(here) && Connected(Owner(here)))) {
  	  if (IsPlayer(here)) {
! 	    notify(player, tprintf(T("%s is listening"), Name(here)));
  	  } else {
! 	    notify(player, tprintf(T("%s [owner: %s] is listening."),
! 				   Name(here), Name(Owner(here))));
  	  }
  	}
        } else {
  	if (Hearer(here) || Listener(here)) {
  	  if (Connected(here))
! 	    notify(player, tprintf("%s [speech]. (connected)", Name(here)));
  	  else
! 	    notify(player, tprintf("%s [speech].", Name(here)));
  	}
  	if (Commer(here))
! 	  notify(player, tprintf("%s [commands].", Name(here)));
        }
      }
    }
--- 1014,1034 ----
  	/* only worry about puppet and players who's owner's are connected */
  	if (Connected(here) || (Puppet(here) && Connected(Owner(here)))) {
  	  if (IsPlayer(here)) {
! 	    notify_format(player, T("%s is listening"), Name(here));
  	  } else {
! 	    notify_format(player, T("%s [owner: %s] is listening."),
! 			  Name(here), Name(Owner(here)));
  	  }
  	}
        } else {
  	if (Hearer(here) || Listener(here)) {
  	  if (Connected(here))
! 	    notify_format(player, "%s [speech]. (connected)", Name(here));
  	  else
! 	    notify_format(player, "%s [speech].", Name(here));
  	}
  	if (Commer(here))
! 	  notify_format(player, "%s [commands].", Name(here));
        }
      }
    }
***************
*** 1054,1069 ****
    }
    if (!Can_Locate(player, thing)) {
      notify(player, T("That player wishes to have some privacy."));
!     notify(thing,
! 	   tprintf(T("%s tried to locate you and failed."), Name(player)));
      return;
    }
!   notify(player,
! 	 tprintf(T("%s is at: %s."), Name(thing),
! 		 unparse_object(player, Location(thing))));
    if (!See_All(player))
!     notify(thing,
! 	   tprintf(T("%s has just located your position."), Name(player)));
    return;
  
  }
--- 1050,1063 ----
    }
    if (!Can_Locate(player, thing)) {
      notify(player, T("That player wishes to have some privacy."));
!     notify_format(thing, T("%s tried to locate you and failed."), Name(player));
      return;
    }
!   notify_format(player,
! 		T("%s is at: %s."), Name(thing),
! 		unparse_object(player, Location(thing)));
    if (!See_All(player))
!     notify_format(thing, T("%s has just located your position."), Name(player));
    return;
  
  }
***************
*** 1096,1103 ****
      return;
    }
    if (!payfor(player, FIND_COST)) {
!     notify(player, tprintf(T("You don't have enough %d %s to do that."),
! 			   FIND_COST, ((FIND_COST == 1) ? MONEY : MONIES)));
      return;
    }
    /* figure out what we're looking for */
--- 1090,1097 ----
      return;
    }
    if (!payfor(player, FIND_COST)) {
!     notify_format(player, T("You don't have enough %d %s to do that."),
! 		  FIND_COST, ((FIND_COST == 1) ? MONEY : MONIES));
      return;
    }
    /* figure out what we're looking for */
***************
*** 1140,1148 ****
        case TYPE_EXIT:
  	if (exd) {
  	  if (Location(counter) == place) {
! 	    notify(player,
! 		   tprintf("%s(#%d) [from: %s(#%d)]", Name(counter),
! 			   counter, Name(Source(counter)), Source(counter)));
  	    exc++;
  	  }
  	}
--- 1134,1142 ----
        case TYPE_EXIT:
  	if (exd) {
  	  if (Location(counter) == place) {
! 	    notify_format(player,
! 			  "%s(#%d) [from: %s(#%d)]", Name(counter),
! 			  counter, Name(Source(counter)), Source(counter));
  	    exc++;
  	  }
  	}
***************
*** 1150,1156 ****
        case TYPE_ROOM:
  	if (rd) {
  	  if (Location(counter) == place) {
! 	    notify(player, tprintf("%s(#%d) [dropto]", Name(counter), counter));
  	    rc++;
  	  }
  	}
--- 1144,1150 ----
        case TYPE_ROOM:
  	if (rd) {
  	  if (Location(counter) == place) {
! 	    notify_format(player, "%s(#%d) [dropto]", Name(counter), counter);
  	    rc++;
  	  }
  	}
***************
*** 1158,1164 ****
        case TYPE_THING:
  	if (td) {
  	  if (Home(counter) == place) {
! 	    notify(player, tprintf("%s(#%d) [home]", Name(counter), counter));
  	    tc++;
  	  }
  	}
--- 1152,1158 ----
        case TYPE_THING:
  	if (td) {
  	  if (Home(counter) == place) {
! 	    notify_format(player, "%s(#%d) [home]", Name(counter), counter);
  	    tc++;
  	  }
  	}
***************
*** 1166,1172 ****
        case TYPE_PLAYER:
  	if (pd) {
  	  if (Home(counter) == place) {
! 	    notify(player, tprintf("%s(#%d) [home]", Name(counter), counter));
  	    pc++;
  	  }
  	}
--- 1160,1166 ----
        case TYPE_PLAYER:
  	if (pd) {
  	  if (Home(counter) == place) {
! 	    notify_format(player, "%s(#%d) [home]", Name(counter), counter);
  	    pc++;
  	  }
  	}
***************
*** 1180,1189 ****
      return;
    } else {
      notify(player, T("----------  Entrances Done  ----------"));
!     notify(player,
! 	   tprintf
! 	   ("Totals: Rooms...%d  Exits...%d  Objects...%d  Players...%d",
! 	    rc, exc, tc, pc));
      return;
    }
  }
--- 1174,1182 ----
      return;
    } else {
      notify(player, T("----------  Entrances Done  ----------"));
!     notify_format(player,
! 		  "Totals: Rooms...%d  Exits...%d  Objects...%d  Players...%d",
! 		  rc, exc, tc, pc);
      return;
    }
  }
***************
*** 1235,1241 ****
        privs = (char *) privs_to_string(attr_privs, AL_FLAGS(atr));
      }
      if (privs && *privs)
!       notify(player, tprintf("@set %s/%s=%s", dh->name, AL_NAME(atr), privs));
    }
    return 1;
  }
--- 1228,1234 ----
        privs = (char *) privs_to_string(attr_privs, AL_FLAGS(atr));
      }
      if (privs && *privs)
!       notify_format(player, "@set %s/%s=%s", dh->name, AL_NAME(atr), privs);
    }
    return 1;
  }
***************
*** 1353,1359 ****
      } else
        object = Name(thing);
      if (dbflag != 4)
!       notify(player, tprintf("@create %s", object));
      break;
    case TYPE_ROOM:
      if (dbflag == 1) {
--- 1346,1352 ----
      } else
        object = Name(thing);
      if (dbflag != 4)
!       notify_format(player, "@create %s", object);
      break;
    case TYPE_ROOM:
      if (dbflag == 1) {
***************
*** 1362,1368 ****
      } else
        object = "here";
      if (dbflag != 4)
!       notify(player, tprintf("@dig/teleport %s", Name(thing)));
      break;
    case TYPE_EXIT:
      if (dbflag == 1) {
--- 1355,1361 ----
      } else
        object = "here";
      if (dbflag != 4)
!       notify_format(player, "@dig/teleport %s", Name(thing));
      break;
    case TYPE_EXIT:
      if (dbflag == 1) {
***************
*** 1370,1376 ****
      } else {
        object = shortname(thing);
        if (dbflag != 4)
! 	notify(player, tprintf("@open %s", Name(thing)));
      }
      break;
    }
--- 1363,1369 ----
      } else {
        object = shortname(thing);
        if (dbflag != 4)
! 	notify_format(player, "@open %s", Name(thing));
      }
      break;
    }
***************
*** 1378,1399 ****
    if (dbflag != 4) {
      if (Mobile(thing)) {
        if (GoodObject(Home(thing)))
! 	notify(player, tprintf("@link %s = #%d", object, Home(thing)));
        else if (Home(thing) == HOME)
! 	notify(player, tprintf("@link %s = HOME", object));
      } else {
        if (GoodObject(Destination(thing)))
! 	notify(player, tprintf("@link %s = #%d", object, Destination(thing)));
        else if (Destination(thing) == AMBIGUOUS)
! 	notify(player, tprintf("@link %s = VARIABLE", object));
        else if (Destination(thing) == HOME)
! 	notify(player, tprintf("@link %s = HOME", object));
      }
  
      if (GoodObject(Zone(thing)))
!       notify(player, tprintf("@chzone %s = #%d", object, Zone(thing)));
      if (GoodObject(Parent(thing)))
!       notify(player, tprintf("@parent %s=#%d", object, Parent(thing)));
  
      decompile_locks(player, thing, object);
      decompile_flags(player, thing, object);
--- 1371,1392 ----
    if (dbflag != 4) {
      if (Mobile(thing)) {
        if (GoodObject(Home(thing)))
! 	notify_format(player, "@link %s = #%d", object, Home(thing));
        else if (Home(thing) == HOME)
! 	notify_format(player, "@link %s = HOME", object);
      } else {
        if (GoodObject(Destination(thing)))
! 	notify_format(player, "@link %s = #%d", object, Destination(thing));
        else if (Destination(thing) == AMBIGUOUS)
! 	notify_format(player, "@link %s = VARIABLE", object);
        else if (Destination(thing) == HOME)
! 	notify_format(player, "@link %s = HOME", object);
      }
  
      if (GoodObject(Zone(thing)))
!       notify_format(player, "@chzone %s = #%d", object, Zone(thing));
      if (GoodObject(Parent(thing)))
!       notify_format(player, "@parent %s=#%d", object, Parent(thing));
  
      decompile_locks(player, thing, object);
      decompile_flags(player, thing, object);
*** 1_7_4.101/src/game.c Thu, 31 May 2001 11:19:20 -0500 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1 660)
--- 1_7_4.129(w)/src/game.c Tue, 10 Jul 2001 14:23:19 -0500 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.3 660)
***************
*** 39,44 ****
--- 39,48 ----
  #include <setjmp.h>
  #endif
  
+ #ifdef macintosh
+ extern void PMSMushSetup(void);
+ #endif
+ 
  #include "conf.h"
  #include "mushdb.h"
  #include "game.h"
***************
*** 176,189 ****
  	  paranoid_checkpt = 1;
        }
        if (flag == 1) {
! 	notify(player, tprintf(T("Paranoid dumping, checkpoint interval %d."),
! 			       paranoid_checkpt));
  	do_rawlog(LT_CHECK,
  		  "*** PARANOID DUMP *** done by %s(#%d),\n",
  		  Name(player), player);
        } else {
! 	notify(player, tprintf(T("Debug dumping, checkpoint interval %d."),
! 			       paranoid_checkpt));
  	do_rawlog(LT_CHECK,
  		  "*** DEBUG DUMP *** done by %s(#%d),\n",
  		  Name(player), player);
--- 180,193 ----
  	  paranoid_checkpt = 1;
        }
        if (flag == 1) {
! 	notify_format(player, T("Paranoid dumping, checkpoint interval %d."),
! 		      paranoid_checkpt);
  	do_rawlog(LT_CHECK,
  		  "*** PARANOID DUMP *** done by %s(#%d),\n",
  		  Name(player), player);
        } else {
! 	notify_format(player, T("Debug dumping, checkpoint interval %d."),
! 		      paranoid_checkpt);
  	do_rawlog(LT_CHECK,
  		  "*** DEBUG DUMP *** done by %s(#%d),\n",
  		  Name(player), player);
***************
*** 670,675 ****
--- 674,682 ----
  #ifdef WIN32
    Win32MUSH_setup();		/* create index files, copy databases etc. */
  #endif
+ #ifdef macintosh
+   PMSMushSetup();
+ #endif
  
    infile = restarting ? options.output_db : options.input_db;
    outfile = options.output_db;
***************
*** 890,898 ****
    /* Halted objects can't execute commands */
    /* And neither can halted players if the command isn't from_port */
    if (Halted(player) && (!IsPlayer(player) || !from_port)) {
!     notify(Owner(player),
! 	   tprintf(T("Attempt to execute command by halted object #%d"),
! 		   player));
      return;
    }
    /* Players and things should not have invalid locations. This check
--- 897,904 ----
    /* Halted objects can't execute commands */
    /* And neither can halted players if the command isn't from_port */
    if (Halted(player) && (!IsPlayer(player) || !from_port)) {
!     notify_format(Owner(player),
! 		  T("Attempt to execute command by halted object #%d"), player);
      return;
    }
    /* Players and things should not have invalid locations. This check
***************
*** 900,908 ****
     */
    if ((!GoodObject(Location(player)) ||
         (IsGarbage(Location(player)))) && Mobile(player)) {
!     notify(Owner(player),
! 	   tprintf(T("Invalid location on command execution: %s(#%d)"),
! 		   Name(player), player));
      do_log(LT_ERR, NOTHING, NOTHING,
  	   T("Command attempted by %s(#%d) in invalid location #%d."),
  	   Name(player), player, Location(player));
--- 906,914 ----
     */
    if ((!GoodObject(Location(player)) ||
         (IsGarbage(Location(player)))) && Mobile(player)) {
!     notify_format(Owner(player),
! 		  T("Invalid location on command execution: %s(#%d)"),
! 		  Name(player), player);
      do_log(LT_ERR, NOTHING, NOTHING,
  	   T("Command attempted by %s(#%d) in invalid location #%d."),
  	   Name(player), player, Location(player));
***************
*** 1209,1218 ****
    for (a = 0; a < db_top; a++)
      if (IsPlayer(a))
        s_Pennies(a, amt);
!   notify(player,
! 	 tprintf
! 	 (T("The money supply of all players has been reset to %d %s."), amt,
! 	  MONIES));
    do_log(LT_WIZ, player, NOTHING,
  	 T("** POOR done ** Money supply reset to %d %s."), amt, MONIES);
  }
--- 1215,1223 ----
    for (a = 0; a < db_top; a++)
      if (IsPlayer(a))
        s_Pennies(a, amt);
!   notify_format(player,
! 		T("The money supply of all players has been reset to %d %s."),
! 		amt, MONIES);
    do_log(LT_WIZ, player, NOTHING,
  	 T("** POOR done ** Money supply reset to %d %s."), amt, MONIES);
  }
***************
*** 1295,1303 ****
      DOLIST(thing, Contents(Location(player))) {
        if (ScanFind(player, thing)) {
  	*ptr = '\0';
! 	notify(player,
! 	       tprintf("%s  [%d:%s]", unparse_object(player, thing), num,
! 		       atrname));
  	ptr = atrname;
        }
      }
--- 1300,1308 ----
      DOLIST(thing, Contents(Location(player))) {
        if (ScanFind(player, thing)) {
  	*ptr = '\0';
! 	notify_format(player,
! 		      "%s  [%d:%s]", unparse_object(player, thing), num,
! 		      atrname);
  	ptr = atrname;
        }
      }
***************
*** 1306,1314 ****
    if (flag & CHECK_HERE) {
      if (ScanFind(player, Location(player))) {
        *ptr = '\0';
!       notify(player, tprintf(T("Matched here: %s  [%d:%s]"),
! 			     unparse_object(player, Location(player)), num,
! 			     atrname));
      }
    }
    ptr = atrname;
--- 1311,1318 ----
    if (flag & CHECK_HERE) {
      if (ScanFind(player, Location(player))) {
        *ptr = '\0';
!       notify_format(player, T("Matched here: %s  [%d:%s]"),
! 		    unparse_object(player, Location(player)), num, atrname);
      }
    }
    ptr = atrname;
***************
*** 1317,1324 ****
      DOLIST(thing, Contents(player)) {
        if (ScanFind(player, thing)) {
  	*ptr = '\0';
! 	notify(player, tprintf("%s  [%d:%s]",
! 			       unparse_object(player, thing), num, atrname));
  	ptr = atrname;
        }
      }
--- 1321,1328 ----
      DOLIST(thing, Contents(player)) {
        if (ScanFind(player, thing)) {
  	*ptr = '\0';
! 	notify_format(player, "%s  [%d:%s]",
! 		      unparse_object(player, thing), num, atrname);
  	ptr = atrname;
        }
      }
***************
*** 1327,1334 ****
    if (flag & CHECK_SELF) {
      if (ScanFind(player, player)) {
        *ptr = '\0';
!       notify(player, tprintf(T("Matched self: %s  [%d:%s]"),
! 			     unparse_object(player, player), num, atrname));
      }
    }
    ptr = atrname;
--- 1331,1338 ----
    if (flag & CHECK_SELF) {
      if (ScanFind(player, player)) {
        *ptr = '\0';
!       notify_format(player, T("Matched self: %s  [%d:%s]"),
! 		    unparse_object(player, player), num, atrname);
      }
    }
    ptr = atrname;
***************
*** 1342,1350 ****
  	  DOLIST(thing, Contents(Zone(Location(player)))) {
  	    if (ScanFind(player, thing)) {
  	      *ptr = '\0';
! 	      notify(player, tprintf("%s  [%d:%s]",
! 				     unparse_object(player, thing), num,
! 				     atrname));
  	      ptr = atrname;
  	    }
  	  }
--- 1346,1353 ----
  	  DOLIST(thing, Contents(Zone(Location(player)))) {
  	    if (ScanFind(player, thing)) {
  	      *ptr = '\0';
! 	      notify_format(player, "%s  [%d:%s]",
! 			    unparse_object(player, thing), num, atrname);
  	      ptr = atrname;
  	    }
  	  }
***************
*** 1353,1362 ****
  	/* regular zone object */
  	if (ScanFind(player, Zone(Location(player)))) {
  	  *ptr = '\0';
! 	  notify(player,
! 		 tprintf(T("Matched zone of location: %s  [%d:%s]"),
! 			 unparse_object(player, Zone(Location(player))),
! 			 num, atrname));
  	}
        }
        ptr = atrname;
--- 1356,1365 ----
  	/* regular zone object */
  	if (ScanFind(player, Zone(Location(player)))) {
  	  *ptr = '\0';
! 	  notify_format(player,
! 			T("Matched zone of location: %s  [%d:%s]"),
! 			unparse_object(player, Zone(Location(player))),
! 			num, atrname);
  	}
        }
        ptr = atrname;
***************
*** 1364,1372 ****
  	/* check the player's personal zone */
  	if (ScanFind(player, Zone(player))) {
  	  *ptr = '\0';
! 	  notify(player, tprintf(T("Matched personal zone: %s  [%d:%s]"),
! 				 unparse_object(player, Zone(player)), num,
! 				 atrname));
  	}
        }
      }
--- 1367,1374 ----
  	/* check the player's personal zone */
  	if (ScanFind(player, Zone(player))) {
  	  *ptr = '\0';
! 	  notify_format(player, T("Matched personal zone: %s  [%d:%s]"),
! 			unparse_object(player, Zone(player)), num, atrname);
  	}
        }
      }
***************
*** 1381,1388 ****
      DOLIST(thing, Contents(MASTER_ROOM)) {
        if (ScanFind(player, thing)) {
  	*ptr = '\0';
! 	notify(player, tprintf("%s  [%d:%s]",
! 			       unparse_object(player, thing), num, atrname));
  	ptr = atrname;
        }
      }
--- 1383,1390 ----
      DOLIST(thing, Contents(MASTER_ROOM)) {
        if (ScanFind(player, thing)) {
  	*ptr = '\0';
! 	notify_format(player, "%s  [%d:%s]",
! 		      unparse_object(player, thing), num, atrname);
  	ptr = atrname;
        }
      }
***************
*** 1538,1561 ****
    notify(player, tbuf1);
  
    /* calculate times until various events */
!   notify(player,
! 	 tprintf(T("Time until next database save: %ld minutes %ld seconds."),
! 		 (options.dump_counter - mudtime) / 60,
! 		 (options.dump_counter - mudtime) % 60));
!   notify(player,
! 	 tprintf(T("   Time until next dbck check: %ld minutes %ld seconds."),
! 		 (options.dbck_counter - mudtime) / 60,
! 		 (options.dbck_counter - mudtime) % 60));
!   notify(player,
! 	 tprintf(T("        Time until next purge: %ld minutes %ld seconds."),
! 		 (options.purge_counter - mudtime) / 60,
! 		 (options.purge_counter - mudtime) % 60));
  #ifdef USE_WARNINGS
    if (options.warn_interval)
!     notify(player,
! 	   tprintf(T("    Time until next @warnings: %ld minutes %ld seconds."),
! 		   (options.warn_counter - mudtime) / 60,
! 		   (options.warn_counter - mudtime) % 60));
  #endif
  
    /* Mortals, go no further! */
--- 1540,1563 ----
    notify(player, tbuf1);
  
    /* calculate times until various events */
!   notify_format(player,
! 		T("Time until next database save: %ld minutes %ld seconds."),
! 		(options.dump_counter - mudtime) / 60,
! 		(options.dump_counter - mudtime) % 60);
!   notify_format(player,
! 		T("   Time until next dbck check: %ld minutes %ld seconds."),
! 		(options.dbck_counter - mudtime) / 60,
! 		(options.dbck_counter - mudtime) % 60);
!   notify_format(player,
! 		T("        Time until next purge: %ld minutes %ld seconds."),
! 		(options.purge_counter - mudtime) / 60,
! 		(options.purge_counter - mudtime) % 60);
  #ifdef USE_WARNINGS
    if (options.warn_interval)
!     notify_format(player,
! 		  T("    Time until next @warnings: %ld minutes %ld seconds."),
! 		  (options.warn_counter - mudtime) / 60,
! 		  (options.warn_counter - mudtime) % 60);
  #endif
  
    /* Mortals, go no further! */
***************
*** 1647,1654 ****
  
    pid = getpid();
    psize = getpagesize();
!   notify(player, tprintf(T("\nProcess ID:  %10u        %10d bytes per page"),
! 			 pid, psize));
  
  #ifdef linux
    /* Linux's getrusage() is mostly unimplemented. Just has times, page faults
--- 1649,1656 ----
  
    pid = getpid();
    psize = getpagesize();
!   notify_format(player, T("\nProcess ID:  %10u        %10d bytes per page"),
! 		pid, psize);
  
  #ifdef linux
    /* Linux's getrusage() is mostly unimplemented. Just has times, page faults
***************
*** 1656,1666 ****
  
  #ifdef HAS_GETRUSAGE
    getrusage(RUSAGE_SELF, &usage);
!   notify(player, tprintf(T("Time used:   %10ld user   %10ld sys"),
! 			 usage.ru_utime.tv_sec, usage.ru_stime.tv_sec));
!   notify(player,
! 	 tprintf(T("Page faults: %10ld hard   %10ld soft    %10ld swapouts"),
! 		 usage.ru_majflt, usage.ru_minflt, usage.ru_nswap));
  #endif
  
    fp = fopen("/proc/self/status", "r");
--- 1658,1668 ----
  
  #ifdef HAS_GETRUSAGE
    getrusage(RUSAGE_SELF, &usage);
!   notify_format(player, T("Time used:   %10ld user   %10ld sys"),
! 		usage.ru_utime.tv_sec, usage.ru_stime.tv_sec);
!   notify_format(player,
! 		T("Page faults: %10ld hard   %10ld soft    %10ld swapouts"),
! 		usage.ru_majflt, usage.ru_minflt, usage.ru_nswap);
  #endif
  
    fp = fopen("/proc/self/status", "r");
***************
*** 1754,1779 ****
  #else				/* LINUX */
  #ifdef HAS_GETRUSAGE
    getrusage(RUSAGE_SELF, &usage);
!   notify(player, tprintf(T("Time used:   %10ld user   %10ld sys"),
! 			 usage.ru_utime.tv_sec, usage.ru_stime.tv_sec));
!   notify(player, tprintf("Max res mem: %10ld pages  %10ld bytes",
! 			 usage.ru_maxrss, (usage.ru_maxrss * psize)));
!   notify(player,
! 	 tprintf("Integral mem:%10ld shared %10ld private %10ld stack",
! 		 usage.ru_ixrss, usage.ru_idrss, usage.ru_isrss));
!   notify(player,
! 	 tprintf(T("Page faults: %10ld hard   %10ld soft    %10ld swapouts"),
! 		 usage.ru_majflt, usage.ru_minflt, usage.ru_nswap));
!   notify(player,
! 	 tprintf(T("Disk I/O:    %10ld reads  %10ld writes"),
! 		 usage.ru_inblock, usage.ru_oublock));
!   notify(player,
! 	 tprintf(T("Network I/O: %10ld in     %10ld out"), usage.ru_msgrcv,
! 		 usage.ru_msgsnd));
!   notify(player,
! 	 tprintf(T("Context swi: %10ld vol    %10ld forced"), usage.ru_nvcsw,
! 		 usage.ru_nivcsw));
!   notify(player, tprintf("Signals:     %10ld", usage.ru_nsignals));
  #endif				/* HAS_GETRUSAGE */
  #endif				/* LINUX */
  }
--- 1756,1781 ----
  #else				/* LINUX */
  #ifdef HAS_GETRUSAGE
    getrusage(RUSAGE_SELF, &usage);
!   notify_format(player, T("Time used:   %10ld user   %10ld sys"),
! 		usage.ru_utime.tv_sec, usage.ru_stime.tv_sec);
!   notify_format(player, "Max res mem: %10ld pages  %10ld bytes",
! 		usage.ru_maxrss, (usage.ru_maxrss * psize));
!   notify_format(player,
! 		"Integral mem:%10ld shared %10ld private %10ld stack",
! 		usage.ru_ixrss, usage.ru_idrss, usage.ru_isrss);
!   notify_format(player,
! 		T("Page faults: %10ld hard   %10ld soft    %10ld swapouts"),
! 		usage.ru_majflt, usage.ru_minflt, usage.ru_nswap);
!   notify_format(player,
! 		T("Disk I/O:    %10ld reads  %10ld writes"),
! 		usage.ru_inblock, usage.ru_oublock);
!   notify_format(player,
! 		T("Network I/O: %10ld in     %10ld out"), usage.ru_msgrcv,
! 		usage.ru_msgsnd);
!   notify_format(player,
! 		T("Context swi: %10ld vol    %10ld forced"), usage.ru_nvcsw,
! 		usage.ru_nivcsw);
!   notify_format(player, "Signals:     %10ld", usage.ru_nsignals);
  #endif				/* HAS_GETRUSAGE */
  #endif				/* LINUX */
  }
*** 1_7_4.101/src/funtime.c Fri, 11 May 2001 15:40:56 -0500 dunemush (pennmush/c/12_funtime.c 1.11.1.3 660)
--- 1_7_4.129(w)/src/funtime.c Tue, 10 Jul 2001 14:23:19 -0500 dunemush (pennmush/c/12_funtime.c 1.11.1.4 660)
***************
*** 34,44 ****
      return;			/* No field? Bad user. */
  
    if (nargs == 2) {
!     if (!is_integer(args[1])) {
!       safe_str(T(e_int), buff, bp);
        return;
      }
!     tt = parse_integer(args[1]);
    } else
      tt = mudtime;
  
--- 34,44 ----
      return;			/* No field? Bad user. */
  
    if (nargs == 2) {
!     if (!is_uinteger(args[1])) {
!       safe_str(T(e_uint), buff, bp);
        return;
      }
!     tt = parse_uinteger(args[1]);
    } else
      tt = mudtime;
  
***************
*** 62,84 ****
  FUNCTION(fun_time)
  {
    char *s;
- 
-   s = (char *) ctime(&mudtime);
-   s[strlen(s) - 1] = '\0';
-   if (s[8] == ' ')
-     s[8] = '0';
-   safe_str(s, buff, bp);
- }
- 
- /* ARGSUSED */
- FUNCTION(fun_utctime)
- {
-   /* Returns a time() string for UTC, not local time */
    struct tm *t;
-   char *s;
  
!   t = gmtime(&mudtime);
!   s = asctime(t);
    s[strlen(s) - 1] = '\0';
    if (s[8] == ' ')
      s[8] = '0';
--- 62,75 ----
  FUNCTION(fun_time)
  {
    char *s;
    struct tm *t;
  
!   if ((nargs == 1 && strcasecmp("UTC", args[0]) == 0) ||
!       strcmp("UTCTIME", called_as) == 0)
!     t = gmtime(&mudtime);
!   else
!     t = localtime(&mudtime);
!   s = (char *) asctime(t);
    s[strlen(s) - 1] = '\0';
    if (s[8] == ' ')
      s[8] = '0';
***************
*** 86,92 ****
  }
  
  /* ARGSUSED */
- 
  FUNCTION(fun_secs)
  {
    safe_integer(mudtime, buff, bp);
--- 77,82 ----
***************
*** 102,119 ****
    char *s;
    int utc = 0;
  
!   if (strcmp(called_as, "CONVUTCSECS") == 0)
      utc = 1;
  
!   if (!is_integer(args[0])) {
!     safe_str(T(e_int), buff, bp);
!     return;
!   }
!   tt = parse_integer(args[0]);
!   if (tt < 0) {
!     safe_str(T("#-1 ARGUMENT MUST BE POSITIVE"), buff, bp);
      return;
    }
  
    if (utc)
      ttm = gmtime(&tt);
--- 92,106 ----
    char *s;
    int utc = 0;
  
!   if (strcmp(called_as, "CONVUTCSECS") == 0 ||
!       (nargs == 2 && strcasecmp("UTC", args[1]) == 0))
      utc = 1;
  
!   if (!is_uinteger(args[0])) {
!     safe_str(T(e_uint), buff, bp);
      return;
    }
+   tt = parse_uinteger(args[0]);
  
    if (utc)
      ttm = gmtime(&tt);
***************
*** 153,177 ****
    int secs, pad;
    int days, hours, mins;
  
!   if (!is_integer(args[0])) {
!     safe_str(T(e_ints), buff, bp);
      return;
    }
    if (nargs == 1)
      pad = 0;
    else {
!     if (!is_integer(args[1])) {
!       safe_str(T(e_ints), buff, bp);
        return;
      }
!     pad = parse_integer(args[1]);
    }
  
!   secs = parse_integer(args[0]);
!   if (secs < 0) {
!     safe_str(T(e_range), buff, bp);
!     return;
!   }
    days = secs / 86400;
    secs %= 86400;
    hours = secs / 3600;
--- 140,161 ----
    int secs, pad;
    int days, hours, mins;
  
!   if (!is_uinteger(args[0])) {
!     safe_str(T(e_uints), buff, bp);
      return;
    }
    if (nargs == 1)
      pad = 0;
    else {
!     if (!is_uinteger(args[1])) {
!       safe_str(T(e_uints), buff, bp);
        return;
      }
!     pad = parse_uinteger(args[1]);
    }
  
!   secs = parse_uinteger(args[0]);
! 
    days = secs / 86400;
    secs %= 86400;
    hours = secs / 3600;
*** 1_7_4.101/src/funstr.c Fri, 08 Jun 2001 14:14:28 -0500 dunemush (pennmush/c/13_funstr.c 1.28.1.1.1.2.1.4.1.4 660)
--- 1_7_4.129(w)/src/funstr.c Tue, 10 Jul 2001 14:23:19 -0500 dunemush (pennmush/c/13_funstr.c 1.28.1.1.1.2.1.4.1.5 660)
***************
*** 1251,1257 ****
  
  FUNCTION(fun_brackets)
  {
!   char *str, *rbuff;
    int rbrack, lbrack, rbrace, lbrace, lcurl, rcurl;
  
    lcurl = rcurl = rbrack = lbrack = rbrace = lbrace = 0;
--- 1251,1257 ----
  
  FUNCTION(fun_brackets)
  {
!   char *str;
    int rbrack, lbrack, rbrace, lbrace, lcurl, rcurl;
  
    lcurl = rcurl = rbrack = lbrack = rbrace = lbrace = 0;
***************
*** 1281,1289 ****
      }
      str++;
    }
!   rbuff =
!     tprintf("%d %d %d %d %d %d", lbrack, rbrack, lbrace, rbrace, lcurl, rcurl);
!   safe_str(rbuff, buff, bp);
  }
  
  
--- 1281,1288 ----
      }
      str++;
    }
!   safe_format(buff, bp, "%d %d %d %d %d %d", lbrack, rbrack,
! 	      lbrace, rbrace, lcurl, rcurl);
  }
  
  
*** 1_7_4.101/src/funmisc.c Sat, 07 Apr 2001 13:33:48 -0500 dunemush (pennmush/c/14_funmisc.c 1.27 660)
--- 1_7_4.129(w)/src/funmisc.c Tue, 10 Jul 2001 14:23:19 -0500 dunemush (pennmush/c/14_funmisc.c 1.28 660)
***************
*** 147,162 ****
  #endif
  
  
  /* ARGSUSED */
  FUNCTION(fun_setq)
  {
    /* sets a variable into a local register */
!   static char qindex[NUMQ] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
!   char *qp;
  
    if (*args[0] && (*(args[0] + 1) == '\0') &&
!       (qp = strchr(qindex, UPCASE(*args[0]))) && renv[qp - qindex]) {
!     strcpy(renv[qp - qindex], args[1]);
      if (!strcmp(called_as, "SETR"))
        safe_str(args[1], buff, bp);
    } else
--- 147,163 ----
  #endif
  
  
+ extern signed char qreg_indexes[UCHAR_MAX + 1];
  /* ARGSUSED */
  FUNCTION(fun_setq)
  {
    /* sets a variable into a local register */
!   int qindex;
  
    if (*args[0] && (*(args[0] + 1) == '\0') &&
!       ((qindex = qreg_indexes[(unsigned char) args[0][0]]) != -1)
!       && renv[qindex]) {
!     strcpy(renv[qindex], args[1]);
      if (!strcmp(called_as, "SETR"))
        safe_str(args[1], buff, bp);
    } else
***************
*** 167,178 ****
  FUNCTION(fun_r)
  {
    /* returns a local register */
!   static char qindex[NUMQ] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
!   char *qp;
  
    if (*args[0] && (*(args[0] + 1) == '\0') &&
!       (qp = strchr(qindex, UPCASE(*args[0]))) && renv[qp - qindex])
!     safe_str(renv[qp - qindex], buff, bp);
    else
      safe_str(T("#-1 REGISTER OUT OF RANGE"), buff, bp);
  }
--- 168,179 ----
  FUNCTION(fun_r)
  {
    /* returns a local register */
!   int qindex;
  
    if (*args[0] && (*(args[0] + 1) == '\0') &&
!       ((qindex = qreg_indexes[(unsigned char) args[0][0]]) != -1)
!       && renv[qindex])
!     safe_str(renv[qindex], buff, bp);
    else
      safe_str(T("#-1 REGISTER OUT OF RANGE"), buff, bp);
  }
*** 1_7_4.101/src/funlist.c Thu, 31 May 2001 11:19:20 -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.1 660)
--- 1_7_4.129(w)/src/funlist.c Tue, 10 Jul 2001 14:23:19 -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.2 660)
***************
*** 2492,2498 ****
  }
  
  
! 
  FUNCTION(fun_regmatch)
  {
  /* ---------------------------------------------------------------------------
--- 2492,2498 ----
  }
  
  
! extern signed char qreg_indexes[UCHAR_MAX + 1];
  FUNCTION(fun_regmatch)
  {
  /* ---------------------------------------------------------------------------
***************
*** 2516,2523 ****
    int offsets[99];
    int subpatterns;
    int flags = 0;
!   static char qindex[NUMQ] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
!   char *qp;
  
    if (strcmp(called_as, "REGMATCHI") == 0)
      flags = PCRE_CASELESS;
--- 2516,2522 ----
    int offsets[99];
    int subpatterns;
    int flags = 0;
!   int qindex;
  
    if (strcmp(called_as, "REGMATCHI&quo