[PENNMUSH-ANNOUNCE] 1.7.4-patch03

dunemush@pennmush.org dunemush at pennmush.org
Tue, 24 Apr 2001 10:35:20 -0500


This is patch03 to PennMUSH 1.7.4. After applying this patch, you will
have version 1.7.4p3

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

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

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

In this patch:

Commands:
  * unfollow with no args now stops you from following everyone.
    dismiss command stops people from followig you.
    desert command stops people from following you or leading you.
    Idea by Oriens@Alexandria. Names suggested by Noltar@Korongil
Minor changes:
  * MONITOR announcements of disconnects distinguish hidden disconnects.
    Suggested by Oriens@Alexandria.
  * The Uptime field of INFO shows first start time, not last reboot time.
    Suggested by Trispis@M*U*S*H.
Fixes:
  * Exact matches are now preferred over partial matches, and no longer
    result in ambiguity. Report by Steven Viscido.
  * Message mentioning INHERIT changed to TRUST by Xyrxwyrth@M*U*S*H.
  * Distributed register.txt file is now more descriptive. 
    Suggested by Xyrxwyrth@M*U*S*H.
  * The ctime(), mtime(), restarttime(), and starttime() functions now 
    return 2-digit days (01 vs. 1). Reported by 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.
  * Mac portability fixes
  * Options.h clarification suggested by rodregis@M*U*S*H.
  * Cosmetic bug in @halt fixed. Report by Trispis@M*U*S*H.
  * Fixed a fencepost error in regedit*() that could generate garbage text.
    Reported by Vadiv@M*U*S*H


Prereq: 1.7.4p2
*** 1_7_4.72/Patchlevel Fri, 23 Mar 2001 14:12:35 -0600 dunemush (pennmush/5_Patchlevel 1.20 600)
--- 1_7_4.81(w)/Patchlevel Fri, 06 Apr 2001 15:23:53 -0500 dunemush (pennmush/5_Patchlevel 1.21 600)
***************
*** 1,2 ****
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.4p2
--- 1,2 ----
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.4p3
*** 1_7_4.72/CHANGES Thu, 05 Apr 2001 11:06:39 -0500 dunemush (pennmush/8_CHANGES 1.196 600)
--- 1_7_4.81(w)/CHANGES Mon, 23 Apr 2001 18:06:21 -0500 dunemush (pennmush/8_CHANGES 1.204 600)
***************
*** 17,22 ****
--- 17,52 ----
  
  ==========================================================================
  
+ Version 1.7.4 patchlevel 3		       April 23, 2001
+ 
+ Commands:
+   * unfollow with no args now stops you from following everyone.
+     dismiss command stops people from followig you.
+     desert command stops people from following you or leading you.
+     Idea by Oriens@Alexandria. Names suggested by Noltar@Korongil
+ Minor changes:
+   * MONITOR announcements of disconnects distinguish hidden disconnects.
+     Suggested by Oriens@Alexandria.
+   * The Uptime field of INFO shows first start time, not last reboot time.
+     Suggested by Trispis@M*U*S*H.
+ Fixes:
+   * Exact matches are now preferred over partial matches, and no longer
+     result in ambiguity. Report by Steven Viscido.
+   * Message mentioning INHERIT changed to TRUST by Xyrxwyrth@M*U*S*H.
+   * Distributed register.txt file is now more descriptive. 
+     Suggested by Xyrxwyrth@M*U*S*H.
+   * The ctime(), mtime(), restarttime(), and starttime() functions now 
+     return 2-digit days (01 vs. 1). Reported by 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.
+   * Mac portability fixes
+   * Options.h clarification suggested by rodregis@M*U*S*H.
+   * Cosmetic bug in @halt fixed. Report by Trispis@M*U*S*H.
+   * Fixed a fencepost error in regedit*() that could generate garbage text.
+     Reported by Vadiv@M*U*S*H
+ 
+ 
  Version 1.7.4 patchlevel 2		       March 23, 2001
  
  Major changes:
*** 1_7_4.72/game/txt/hlp/pennvers.hlp Thu, 05 Apr 2001 11:06:39 -0500 dunemush (pennmush/12_pennvers.h 1.145 600)
--- 1_7_4.81(w)/game/txt/hlp/pennvers.hlp Mon, 23 Apr 2001 18:06:29 -0500 dunemush (pennmush/12_pennvers.h 1.153 600)
***************
*** 1,5 ****
  & changes
! & 1.7.4p2
  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.4p3
  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,47 ----
  A list of the patchlevels associated with each release can
  be read in 'help patchlevels'.
  
+ Version 1.7.4 patchlevel 3		       April 23, 2001
+ 
+ Commands:
+   * unfollow with no args now stops you from following everyone.
+     dismiss command stops people from followig you.
+     desert command stops people from following you or leading you.
+     Idea by Oriens@Alexandria. Names suggested by Noltar@Korongil
+ Minor changes:
+   * MONITOR announcements of disconnects distinguish hidden disconnects.
+     Suggested by Oriens@Alexandria.
+   * The Uptime field of INFO shows first start time, not last reboot time.
+     Suggested by Trispis@M*U*S*H.
+ Fixes:
+   * Exact matches are now preferred over partial matches, and no longer
+     result in ambiguity. Report by Steven Viscido.
+   * Message mentioning INHERIT changed to TRUST by Xyrxwyrth@M*U*S*H.
+   * Distributed register.txt file is now more descriptive. 
+     Suggested by Xyrxwyrth@M*U*S*H.
+   * The ctime(), mtime(), restarttime(), and starttime() functions now 
+     return 2-digit days (01 vs. 1). Reported by 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.
+   * Mac portability fixes
+   * Options.h clarification suggested by rodregis@M*U*S*H.
+   * Cosmetic bug in @halt fixed. Report by Trispis@M*U*S*H.
+   * Fixed a fencepost error in regedit*() that could generate garbage text.
+     Reported by Vadiv@M*U*S*H
+ 
+ 
+ & 1.7.4p2
  Version 1.7.4 patchlevel 2		       March 23, 2001
  
  Major changes:
***************
*** 4587,4593 ****
      is configurable.
  
  & patchlevels
! 1.7.4: 0, 1, 2
  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
--- 4618,4624 ----
      is configurable.
  
  & patchlevels
! 1.7.4: 0, 1, 2, 3
  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.72/game/txt/hlp/penncmd.hlp Fri, 23 Mar 2001 14:12:35 -0600 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.1 600)
--- 1_7_4.81(w)/game/txt/hlp/penncmd.hlp Sat, 07 Apr 2001 13:18:28 -0500 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.2 600)
***************
*** 3159,3167 ****
    object moves around (except if it @teleports away or goes home), you
    will automatically move around with it, so long as you pass all the
    locks and enter/leave locks on the exits and things the object moves
!   through.
  
! See also: unfollow, followers(), @follow, @ofollow, @afollow
  & get
  & take
    get <object>
--- 3159,3186 ----
    object moves around (except if it @teleports away or goes home), you
    will automatically move around with it, so long as you pass all the
    locks and enter/leave locks on the exits and things the object moves
!   through. This doesn't prevent you from going somewhere else on your
!   own.
  
! See also: unfollow, dismiss, desert, followers(), @follow, @ofollow, @afollow
! & dismiss
!   dismiss <object>
!   dismiss
! 
!   The dismiss command stops <object> from following you. If no object
!   is given, it stops everyone from following you.
! 
! See also: follow, unfollow, desert, followers()
! & desert
!   desert <object>
!   desert
!  
!   The desert command stops <object> from following you and stops you
!   from following <object>. That is, it's shorthand for 'unfollow <object>'
!   and 'dismiss <object>'. If no object is given, it stops everyone from
!   following or leading you.
! 
! See also: follow, unfollow, dismiss, followers(), following()
  & get
  & take
    get <object>
***************
*** 3421,3433 ****
    unfollow
    unfollow <object>
  
!   The first form of this command clears off all your followers, if you
!   have any. The second form of this command enables you to stop 
!   following an object which you were formerly following. Note that you
!   can also stop following by going off in a different direction before
!   the object moves.
  
! See also: follow, followers(), @follow, @ofollow, @afollow
  & use
    use <object>
  
--- 3440,3450 ----
    unfollow
    unfollow <object>
  
!   This command stops you from following an object that you were formerly
!   following. If no object is given, you stop following everyone you
!   were following.
  
! See also: follow, dismiss, desert, followers(), @follow, @ofollow, @afollow
  & use
    use <object>
  
*** 1_7_4.72/game/txt/register.txt Sat, 15 Apr 2000 10:56:00 -0500 dunemush (pennmush/24_register.t 1.1 600)
--- 1_7_4.81(w)/game/txt/register.txt Sat, 07 Apr 2001 09:14:52 -0500 dunemush (pennmush/24_register.t 1.1.2.1 600)
***************
*** 1,3 ****
! Should we ever decide to go registration (God forbid) this is what will
! get shown to the hapless user.
  
--- 1,5 ----
! This message is shown when a user tries to create a player or register
! a player from a site that doesn't allow creation or registration,
! respectively. Alas. You'll probably have to send email to the
! person who runs this MUSH if you want a character.
  
*** 1_7_4.72/hints/solaris_2.sh Mon, 26 Mar 2001 15:18:14 -0600 dunemush (pennmush/b/4_solaris_2. 1.2 600)
--- 1_7_4.81(w)/hints/solaris_2.sh Sat, 07 Apr 2001 12:39:58 -0500 dunemush (pennmush/b/4_solaris_2. 1.3 600)
***************
*** 1,2 ****
--- 1,4 ----
  ccflags="-DNO_SIGCONTEXT"
  libs="-lnsl -lsocket -lm -lc -lresolv" 
+ i_fcntl="define"
+ has_sigchld="define"
*** 1_7_4.72/src/set.c Fri, 23 Mar 2001 14:12:35 -0600 dunemush (pennmush/b/38_set.c 1.25 660)
--- 1_7_4.81(w)/src/set.c Mon, 23 Apr 2001 18:05:52 -0500 dunemush (pennmush/b/38_set.c 1.26 660)
***************
*** 426,432 ****
        if (Hasprivs(thing))
  	notify(player, T("Warning: @chzoning a privileged player."));
        if (Flags(thing) & INHERIT)
! 	notify(player, T("Warning: @chzoning an INHERIT player."));
      }
    }
    notify(player, T("Zone changed."));
--- 426,432 ----
        if (Hasprivs(thing))
  	notify(player, T("Warning: @chzoning a privileged player."));
        if (Flags(thing) & INHERIT)
! 	notify(player, T("Warning: @chzoning an TRUST player."));
      }
    }
    notify(player, T("Zone changed."));
*** 1_7_4.72/src/move.c Fri, 23 Mar 2001 14:25:48 -0600 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.2 660)
--- 1_7_4.81(w)/src/move.c Mon, 23 Apr 2001 18:05:52 -0500 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3 660)
***************
*** 805,811 ****
  }
  
  /* unfollow <arg> removes someone from your following list 
!  * unfollow alone stops everyone from following you.
   */
  void
  do_unfollow(player, arg)
--- 805,811 ----
  }
  
  /* unfollow <arg> removes someone from your following list 
!  * unfollow alone removes everyone from your following list. (1.7.4p3)
   */
  void
  do_unfollow(player, arg)
***************
*** 828,836 ****
      /* Ok, looks good */
      del_follow(leader, player, 1);
    } else {
!     /* Stop everyone from following me */
      clear_followers(player, 1);
!     notify(player, T("You stop everyone from following you."));
    }
  }
  
--- 828,900 ----
      /* Ok, looks good */
      del_follow(leader, player, 1);
    } else {
!     /* Stop following everyone */
!     clear_following(player, 1);
!     notify(player, T("You stop following anyone."));
!   }
! }
! 
! 
! /* dismiss <arg> removes someone from your followers list 
!  * dismiss alone removes everyone from your followers list.
!  */
! void
! do_dismiss(player, arg)
!     dbref player;
!     const char *arg;
! {
!   dbref follower;
!   if (arg && *arg) {
!     /* Who do we want to stop leading? */
!     follower = match_result(player, arg, NOTYPE, MAT_OBJECTS);
!     if (!GoodObject(follower)) {
!       notify(player, T("I don't recognize who you want to dismiss."));
!       return;
!     }
!     /* Are we following them? */
!     if (!is_following(follower, player)) {
!       notify_format(player, T("%s isn't following you."), Name(follower));
!       return;
!     }
!     /* Ok, looks good */
!     del_follow(player, follower, 1);
!   } else {
!     /* Stop leading everyone */
!     clear_followers(player, 1);
!     notify(player, T("You dismiss all your followers."));
!   }
! }
! 
! /* desert <arg> removes someone from your followers and following list 
!  * desert alone removes everyone from both lists
!  */
! void
! do_desert(player, arg)
!     dbref player;
!     const char *arg;
! {
!   dbref who;
!   if (arg && *arg) {
!     /* Who do we want to stop leading? */
!     who = match_result(player, arg, NOTYPE, MAT_OBJECTS);
!     if (!GoodObject(who)) {
!       notify(player, T("I don't recognize who you want to desert."));
!       return;
!     }
!     /* Are we following or leading them? */
!     if (!is_following(who, player) && !is_following(player, who)) {
!       notify_format(player, T("%s isn't following you, nor vice versa."),
! 		    Name(who));
!       return;
!     }
!     /* Ok, looks good */
!     del_follow(player, who, 1);
!     del_follow(who, player, 1);
!   } else {
!     /* Stop leading everyone */
      clear_followers(player, 1);
!     clear_following(player, 1);
!     notify(player, T("You desert everyone you're leading or following."));
    }
  }
  
*** 1_7_4.72/src/match.c Mon, 02 Apr 2001 13:43:46 -0500 dunemush (pennmush/c/2_match.c 1.17 660)
--- 1_7_4.81(w)/src/match.c Mon, 23 Apr 2001 18:05:51 -0500 dunemush (pennmush/c/2_match.c 1.20 660)
***************
*** 164,170 ****
      const int type;
      const long int flags;
  {
!   dbref match = NOTHING, last_match = NOTHING;
    int match_count = 0;
    if (flags & MAT_ME) {
      match = match_me(who, name);
--- 164,171 ----
      const int type;
      const long int flags;
  {
!   dbref match = NOTHING, last_match = NOTHING, exact_match = NOTHING;
!   int exact_match_count = 0;
    int match_count = 0;
    if (flags & MAT_ME) {
      match = match_me(who, name);
***************
*** 206,260 ****
    /* These return a match if the match is exact, and otherwise
     * store last thing matched in last_match and the number of matches
     * in match_count. Remote_contents and Neighbor are exclusive.
     */
    if (DO_GLOBALS && (flags & MAT_REMOTE_CONTENTS)) {
      match =
        match_remote_contents(who, name, type, flags, &last_match, &match_count);
    }
    if (flags & MAT_NEIGHBOR) {
      match = match_neighbor(who, name, type, flags, &last_match, &match_count);
    }
    if (flags & MAT_POSSESSION) {
!     match = choose_thing(who, type, flags, match,
! 			 match_possession(who, name, type, flags,
! 					  &last_match, &match_count),
! 			 &match_count);
    }
    if (flags & MAT_EXIT) {
!     match = choose_thing(who, type, flags, match,
! 			 match_exit(who, name, type, flags), &match_count);
    }
    if (flags & MAT_CONTAINER) {
!     match = choose_thing(who, type, flags, match,
! 			 match_container(who, name, type, flags, &last_match,
! 					 &match_count), &match_count);
    }
    if (flags & MAT_CARRIED_EXIT) {
!     match = choose_thing(who, type, flags, match,
! 			 match_exit_internal(who, name, type, flags, who,
! 					     &match_count), &match_count);
    }
!   if ((flags & MAT_ENGLISH) && (!GoodObject(match))) {
      match = match_english(who, name, type, flags);
    }
  
    /* Set up the default match_result behavior */
!   /* If we already have an exact match, it's in match */
!   switch (match_count) {
!   case 0:
!     if (!GoodObject(match))
        match = NOTHING;
!     break;
!   case 1:
!     if (!GoodObject(match))
        match = last_match;
!     break;
!   default:
!     if (flags & MAT_LAST)
        match = last_match;
      else
        match = AMBIGUOUS;
-     break;
    }
  
    /* Handle noisy_match_result */
--- 207,285 ----
    /* These return a match if the match is exact, and otherwise
     * store last thing matched in last_match and the number of matches
     * in match_count. Remote_contents and Neighbor are exclusive.
+    * We need to deal with the possibility of having multiple exact
+    * matches, multiple partial matches, or 1 exact + 1 or more partial
+    * matches. 
     */
    if (DO_GLOBALS && (flags & MAT_REMOTE_CONTENTS)) {
      match =
        match_remote_contents(who, name, type, flags, &last_match, &match_count);
+     if (GoodObject(match)) {
+       exact_match_count++;
+       exact_match = match;
+     }
    }
    if (flags & MAT_NEIGHBOR) {
      match = match_neighbor(who, name, type, flags, &last_match, &match_count);
+     if (GoodObject(match)) {
+       exact_match_count++;
+       exact_match = match;
+     }
    }
    if (flags & MAT_POSSESSION) {
!     match = match_possession(who, name, type, flags, &last_match, &match_count);
!     if (GoodObject(match)) {
!       exact_match_count++;
!       exact_match = match;
!     }
    }
    if (flags & MAT_EXIT) {
!     match = match_exit(who, name, type, flags);
!     if (GoodObject(match)) {
!       exact_match_count++;
!       exact_match = match;
!     }
    }
    if (flags & MAT_CONTAINER) {
!     match = match_container(who, name, type, flags, &last_match, &match_count);
!     if (GoodObject(match)) {
!       exact_match_count++;
!       exact_match = match;
!     }
    }
    if (flags & MAT_CARRIED_EXIT) {
!     match = match_exit_internal(who, name, type, flags, who, &match_count);
!     if (GoodObject(match)) {
!       exact_match_count++;
!       exact_match = match;
!     }
    }
!   if ((flags & MAT_ENGLISH) && !GoodObject(last_match)
!       && !GoodObject(exact_match)) {
      match = match_english(who, name, type, flags);
+     if (GoodObject(match)) {
+       exact_match_count++;
+       exact_match = match;
+     }
    }
  
    /* Set up the default match_result behavior */
!   if (GoodObject(exact_match)) {
!     if (exact_match_count == 1)
!       match = exact_match;
!     else if (flags & MAT_LAST)
!       match = exact_match;
!     else
!       match = AMBIGUOUS;
!   } else {
!     if (match_count == 0)
        match = NOTHING;
!     else if (match_count == 1)
        match = last_match;
!     else if (flags & MAT_LAST)
        match = last_match;
      else
        match = AMBIGUOUS;
    }
  
    /* Handle noisy_match_result */
***************
*** 321,326 ****
--- 346,354 ----
    return NOTHING;
  }
  
+ /* This code should return a matched dbref only on an exact match.
+  * Otherwise, it puts the best partial match in last_match
+  */
  static dbref
  match_list(match_who, match_name, type, flags, first, last_match, match_count)
      const dbref match_who;
***************
*** 342,357 ****
    DOLIST(first, first) {
      if (first == absolute) {
        return first;
!     } else if (!strcasecmp(Name(first), match_name)) {
!       /* if there are multiple exact matches, randomly choose one */
!       the_match =
! 	choose_thing(match_who, type, flags, the_match, first, match_count);
!     } else if (GoodObject(alias_match) && (alias_match == first)) {
!       the_match =
! 	choose_thing(match_who, type, flags, the_match, first, match_count);
      } else if (string_match(Name(first), match_name)) {
!       *last_match = first;
!       *match_count += 1;
      }
    }
    return the_match;
--- 370,390 ----
    DOLIST(first, first) {
      if (first == absolute) {
        return first;
!     } else if (!strcasecmp(Name(first), match_name) ||
! 	       (GoodObject(alias_match) && (alias_match == first))) {
!       if (GoodObject(the_match)) {
! 	/* if there are multiple exact matches, don't match any but 
! 	 * make sure match_count is high enough that we report ambiguity
! 	 */
! 	*match_count += 2;
! 	*last_match =
! 	  choose_thing(match_who, type, flags, the_match, first, match_count);
! 	return NOTHING;
!       } else
! 	the_match = first;
      } else if (string_match(Name(first), match_name)) {
!       *last_match =
! 	choose_thing(match_who, type, flags, *last_match, first, match_count);
      }
    }
    return the_match;
***************
*** 612,617 ****
--- 645,652 ----
  {
    int has1;
    int has2;
+   if (match_count)
+     (*match_count)++;
    if (thing1 == NOTHING) {
      return thing2;
    } else if (thing2 == NOTHING) {
*** 1_7_4.72/src/malias.c Fri, 02 Mar 2001 10:50:52 -0600 dunemush (pennmush/c/3_malias.c 1.28 660)
--- 1_7_4.81(w)/src/malias.c Mon, 23 Apr 2001 18:05:51 -0500 dunemush (pennmush/c/3_malias.c 1.29 660)
***************
*** 257,277 ****
  	((m->nflags & ALIAS_ADMIN) && Hasprivs(player)) ||
  	((m->nflags & ALIAS_MEMBERS) && ismember(m, player))) {
        if (!notified) {
! 	notify(player, tprintf("%-12s %-35s %s %-15s",
  			       T("Name"), T("Alias Description"), T("Use See"),
  			       T("Owner")));
  	notified++;
        }
- #ifdef macintosh
        notify(player,
! 	     tprintf("%-12.12s %-35.35s %s %-15.15s", m->name,
  		     uncompress((unsigned char *) (m->desc)), get_shortprivs(m),
  		     Name(m->owner)));
- #else
-       notify(player,
- 	     tprintf("%-12.12s %-35.35s %s %-15.15s", m->name,
- 		     uncompress(m->desc), get_shortprivs(m), Name(m->owner)));
- #endif
      }
    }
  
--- 257,271 ----
  	((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)));
      }
    }
  
***************
*** 438,446 ****
  
    m = get_malias(player, alias);
    if (!m) {
!     notify(player,
! 	   T
! 	   ("MAIL: Not a valid alias. Remember to prefix the alias name with *."));
      return;
    }
    if (!tolist || !*tolist) {
--- 432,441 ----
  
    m = get_malias(player, alias);
    if (!m) {
!     notify_format(player,
! 		  T
! 		  ("MAIL: Not a valid alias. Remember to prefix the alias name with %c."),
! 		  MALIAS_TOKEN);
      return;
    }
    if (!tolist || !*tolist) {
***************
*** 536,544 ****
  
    for (i = 0; i < ma_top; i++) {
      m = &malias[i];
!     notify(player, tprintf("#%-4d %-10.10s %-40.40s %-11.11s (%3d)",
! 			   i, m->name, uncompress(m->desc), Name(m->owner),
! 			   m->size));
    }
  
    notify(player, T("***** End of Mail Aliases *****"));
--- 531,540 ----
  
    for (i = 0; i < ma_top; i++) {
      m = &malias[i];
!     notify_format(player, "#%-4d %c%-10.10s %-40.40s %-11.11s (%3d)",
! 		  i, MALIAS_TOKEN, m->name,
! 		  uncompress((unsigned char *) m->desc),
! 		  Name(m->owner), m->size);
    }
  
    notify(player, T("***** End of Mail Aliases *****"));
*** 1_7_4.72/src/funmisc.c Sat, 17 Feb 2001 10:56:52 -0600 dunemush (pennmush/c/14_funmisc.c 1.26 660)
--- 1_7_4.81(w)/src/funmisc.c Mon, 23 Apr 2001 18:05:51 -0500 dunemush (pennmush/c/14_funmisc.c 1.27 660)
***************
*** 332,350 ****
  /* ARGSUSED */
  FUNCTION(fun_starttime)
  {
!   char tbuf1[BUFFER_LEN];
!   strcpy(tbuf1, ctime(&first_start_time));
!   tbuf1[strlen(tbuf1) - 1] = '\0';
!   safe_str(tbuf1, buff, bp);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_restarttime)
  {
!   char tbuf1[BUFFER_LEN];
!   strcpy(tbuf1, ctime(&start_time));
!   tbuf1[strlen(tbuf1) - 1] = '\0';
!   safe_str(tbuf1, buff, bp);
  }
  
  /* ARGSUSED */
--- 332,354 ----
  /* ARGSUSED */
  FUNCTION(fun_starttime)
  {
!   char *s;
!   s = (char *) ctime(&first_start_time);
!   s[strlen(s) - 1] = '\0';
!   if (s[8] == ' ')
!     s[8] = '0';
!   safe_str(s, buff, bp);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_restarttime)
  {
!   char *s;
!   s = (char *) ctime(&start_time);
!   s[strlen(s) - 1] = '\0';
!   if (s[8] == ' ')
!     s[8] = '0';
!   safe_str(s, buff, bp);
  }
  
  /* ARGSUSED */
*** 1_7_4.72/src/funlist.c Thu, 05 Apr 2001 10:45:56 -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.1 660)
--- 1_7_4.81(w)/src/funlist.c Mon, 23 Apr 2001 18:05:51 -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 660)
***************
*** 2449,2455 ****
  	continue;
        }
        r = endsub - 1;
!       if (offset > subpatterns)
  	continue;
  
        pcre_copy_substring(args[0], offsets, subpatterns, offset,
--- 2449,2455 ----
  	continue;
        }
        r = endsub - 1;
!       if (offset >= subpatterns)
  	continue;
  
        pcre_copy_substring(args[0], offsets, subpatterns, offset,
***************
*** 2462,2470 ****
      /* Make sure we advance at least 1 char */
      if (offsets[0] == match_offset)
        match_offset++;
!   } while (all && (subpatterns =
! 		   pcre_exec(re, study, args[0], len, match_offset,
! 			     0, offsets, 99)) >= 0);
  
  
    /* Now copy everything after the matched bit */
--- 2462,2471 ----
      /* Make sure we advance at least 1 char */
      if (offsets[0] == match_offset)
        match_offset++;
!   } while (all && match_offset < len && (subpatterns =
! 					 pcre_exec(re, study, args[0], len,
! 						   match_offset, 0, offsets,
! 						   99)) >= 0);
  
  
    /* Now copy everything after the matched bit */
*** 1_7_4.72/src/fundb.c Mon, 12 Feb 2001 09:57:12 -0600 dunemush (pennmush/c/17_fundb.c 1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.7.1.3.1.3.1.3.1.2.1.2.1.3.2.1 660)
--- 1_7_4.81(w)/src/fundb.c Mon, 23 Apr 2001 18:05:51 -0500 dunemush (pennmush/c/17_fundb.c 1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.7.1.3.1.3.1.3.1.2.1.2.1.3.2.1.2.1 660)
***************
*** 1016,1024 ****
  FUNCTION(fun_ctime)
  {
    dbref it = match_thing(executor, args[0]);
    if ((it != NOTHING) && Can_Examine(executor, it)) {
!     safe_str(ctime(&CreTime(it)), buff, bp);
!     (*bp)--;
      return;
    }
    safe_str("#-1", buff, bp);
--- 1016,1029 ----
  FUNCTION(fun_ctime)
  {
    dbref it = match_thing(executor, args[0]);
+   char *s;
+ 
    if ((it != NOTHING) && Can_Examine(executor, it)) {
!     s = (char *) ctime(&CreTime(it));
!     s[strlen(s) - 1] = '\0';
!     if (s[8] == ' ')
!       s[8] = '0';
!     safe_str(s, buff, bp);
      return;
    }
    safe_str("#-1", buff, bp);
***************
*** 1028,1036 ****
  FUNCTION(fun_mtime)
  {
    dbref it = match_thing(executor, args[0]);
    if ((it != NOTHING) && Can_Examine(executor, it) && !IsPlayer(it)) {
!     safe_str(ctime(&ModTime(it)), buff, bp);
!     (*bp)--;
      return;
    }
    safe_str("#-1", buff, bp);
--- 1033,1045 ----
  FUNCTION(fun_mtime)
  {
    dbref it = match_thing(executor, args[0]);
+   char *s;
    if ((it != NOTHING) && Can_Examine(executor, it) && !IsPlayer(it)) {
!     s = (char *) ctime(&ModTime(it));
!     s[strlen(s) - 1] = '\0';
!     if (s[8] == ' ')
!       s[8] = '0';
!     safe_str(s, buff, bp);
      return;
    }
    safe_str("#-1", buff, bp);
*** 1_7_4.72/src/extchat.c Mon, 26 Mar 2001 15:33:20 -0600 dunemush (pennmush/c/23_extchat.c 1.1.1.1.1.1.1.1.1.2.1.1.1.3.1.1.1.5.1.1.1.1.1.5.1.2.1.3.1.3.1.1.1.4.1.2.1.6.1.2.1.1.2.2 660)
--- 1_7_4.81(w)/src/extchat.c Mon, 23 Apr 2001 18:05:50 -0500 dunemush (pennmush/c/23_extchat.c 1.1.1.1.1.1.1.1.1.2.1.1.1.3.1.1.1.5.1.1.1.1.1.5.1.2.1.3.1.3.1.1.1.4.1.2.1.6.1.2.1.1.2.4 660)
***************
*** 834,844 ****
    }
    /* It's on or off now */
    /* Determine who is getting added or deleted. If we don't have
!    * an argument, we assume it's the player.
     */
!   if (!target || !*target)
!     victim = player;
!   else if ((victim = lookup_player(target)) != NOTHING) ;
    else if (Channel_Object(chan))
      victim = match_result(player, target, TYPE_THING, MAT_OBJECTS);
    else
--- 834,846 ----
    }
    /* It's on or off now */
    /* Determine who is getting added or deleted. If we don't have
!    * an argument, we return, because we should've caught those above,
!    * and this shouldn't happen.
     */
!   if (!target || !*target) {
!     notify(player, T("I don't understand what you want to do."));
!     return;
!   } else if ((victim = lookup_player(target)) != NOTHING) ;
    else if (Channel_Object(chan))
      victim = match_result(player, target, TYPE_THING, MAT_OBJECTS);
    else
***************
*** 882,897 ****
        }
      }
      if (insert_user_by_dbref(victim, chan)) {
!       if (victim != player) {
! 	notify(victim,
! 	       tprintf(T("CHAT: %s joins you to channel <%s>."), Name(player),
! 		       ChanName(chan)));
! 	notify(player,
! 	       tprintf(T("CHAT: You join %s to channel <%s>."), Name(victim),
! 		       ChanName(chan)));
!       } else
! 	notify(victim,
! 	       tprintf(T("CHAT: You join channel <%s>."), ChanName(chan)));
        if (!Channel_Quiet(chan) && !DarkLegal(victim))
  	channel_broadcast(chan, victim, 1,
  			  T("<%s> %s has joined this channel."), ChanName(chan),
--- 884,895 ----
        }
      }
      if (insert_user_by_dbref(victim, chan)) {
!       notify(victim,
! 	     tprintf(T("CHAT: %s joins you to channel <%s>."), Name(player),
! 		     ChanName(chan)));
!       notify(player,
! 	     tprintf(T("CHAT: You join %s to channel <%s>."), Name(victim),
! 		     ChanName(chan)));
        if (!Channel_Quiet(chan) && !DarkLegal(victim))
  	channel_broadcast(chan, victim, 1,
  			  T("<%s> %s has joined this channel."), ChanName(chan),
***************
*** 918,933 ****
  	channel_broadcast(chan, victim, 1,
  			  T("<%s> %s has left this channel."), ChanName(chan),
  			  Name(victim));
!       if (victim != player) {
! 	notify(victim,
! 	       tprintf(T("CHAT: %s removes you from channel <%s>."),
! 		       Name(player), ChanName(chan)));
! 	notify(player,
! 	       tprintf(T("CHAT: You remove %s from channel <%s>."),
! 		       Name(victim), ChanName(chan)));
!       } else
! 	notify(victim,
! 	       tprintf(T("CHAT: You leave channel <%s>."), ChanName(chan)));
      } else {
        notify(player, tprintf(T("%s is not on channel <%s>."), Name(victim),
  			     ChanName(chan)));
--- 916,927 ----
  	channel_broadcast(chan, victim, 1,
  			  T("<%s> %s has left this channel."), ChanName(chan),
  			  Name(victim));
!       notify(victim,
! 	     tprintf(T("CHAT: %s removes you from channel <%s>."),
! 		     Name(player), ChanName(chan)));
!       notify(player,
! 	     tprintf(T("CHAT: You remove %s from channel <%s>."),
! 		     Name(victim), ChanName(chan)));
      } else {
        notify(player, tprintf(T("%s is not on channel <%s>."), Name(victim),
  			     ChanName(chan)));
*** 1_7_4.72/src/cque.c Fri, 02 Feb 2001 15:59:46 -0600 dunemush (pennmush/c/28_cque.c 1.34 660)
--- 1_7_4.81(w)/src/cque.c Mon, 23 Apr 2001 18:05:50 -0500 dunemush (pennmush/c/28_cque.c 1.35 660)
***************
*** 1022,1028 ****
  	notify_format(player, "%s: %s's %s(%s)", T("Halted"),
  		      Name(Owner(victim)), Name(victim), unparse_dbref(victim));
  	notify_format(Owner(victim),
! 		      "%s: %s%s), by %s", T("Halted"),
  		      Name(victim), unparse_dbref(victim), Name(player));
        }
        if (*arg2 == '\0')
--- 1022,1028 ----
  	notify_format(player, "%s: %s's %s(%s)", T("Halted"),
  		      Name(Owner(victim)), Name(victim), unparse_dbref(victim));
  	notify_format(Owner(victim),
! 		      "%s: %s(%s), by %s", T("Halted"),
  		      Name(victim), unparse_dbref(victim), Name(player));
        }
        if (*arg2 == '\0')
*** 1_7_4.72/src/command.c Fri, 02 Mar 2001 10:50:52 -0600 dunemush (pennmush/c/36_command.c 1.56.1.1.1.1 660)
--- 1_7_4.81(w)/src/command.c Mon, 23 Apr 2001 18:05:50 -0500 dunemush (pennmush/c/36_command.c 1.56.1.1.1.1.1.1 660)
***************
*** 280,285 ****
--- 280,287 ----
     0, 0, 0},
  
    {"BRIEF", NULL, cmd_brief, CMD_T_ANY, 0, 0, 0},
+   {"DESERT", NULL, cmd_desert, CMD_T_PLAYER | CMD_T_THING, 0, 0, 0},
+   {"DISMISS", NULL, cmd_dismiss, CMD_T_PLAYER | CMD_T_THING, 0, 0, 0},
    {"DROP", NULL, cmd_drop, CMD_T_PLAYER | CMD_T_THING, 0, 0, 0},
    {"EXAMINE", "BRIEF DEBUG MORTAL", cmd_examine, CMD_T_ANY, 0, 0, 0},
    {"ENTER", NULL, cmd_enter, CMD_T_ANY, 0, 0, 0},
*** 1_7_4.72/src/cmds.c Sun, 01 Apr 2001 17:37:14 -0500 dunemush (pennmush/c/37_cmds.c 1.33.1.1.1.1 660)
--- 1_7_4.81(w)/src/cmds.c Mon, 23 Apr 2001 18:05:50 -0500 dunemush (pennmush/c/37_cmds.c 1.33.1.1.1.2 660)
***************
*** 928,933 ****
--- 928,941 ----
    do_enter(player, arg_left, 0);
  }
  
+ COMMAND (cmd_dismiss) {
+   do_dismiss(player, arg_left);
+ }
+ 
+ COMMAND (cmd_desert) {
+   do_desert(player, arg_left);
+ }
+ 
  COMMAND (cmd_follow) {
    do_follow(player, arg_left);
  }
*** 1_7_4.72/src/bsd.c Thu, 05 Apr 2001 11:06:39 -0500 dunemush (pennmush/c/38_bsd.c 1.58.1.11.1.2.1.5.1.7.1.14.1.13.1.9.1.4.1.2.1.6 660)
--- 1_7_4.81(w)/src/bsd.c Mon, 23 Apr 2001 18:05:49 -0500 dunemush (pennmush/c/38_bsd.c 1.58.1.11.1.2.1.5.1.7.1.14.1.13.1.9.1.4.1.2.1.12 660)
***************
*** 4029,4035 ****
      }
    }
    queue_string(call_by, tprintf("Name: %s\r\n", options.mud_name));
!   queue_string(call_by, tprintf("Uptime: %s\r", ctime(&start_time)));
    queue_string(call_by, tprintf("Connected: %d\r\n", count));
    queue_string(call_by, tprintf("Size: %d\r\n", db_top));
    queue_string(call_by, tprintf("Version: %s\r\n", SHORTVN));
--- 4029,4035 ----
      }
    }
    queue_string(call_by, tprintf("Name: %s\r\n", options.mud_name));
!   queue_string(call_by, tprintf("Uptime: %s\r", ctime(&first_start_time)));
    queue_string(call_by, tprintf("Connected: %d\r\n", count));
    queue_string(call_by, tprintf("Size: %d\r\n", db_top));
    queue_string(call_by, tprintf("Version: %s\r\n", SHORTVN));
***************
*** 4168,4174 ****
--- 4168,4178 ----
    if (dt < 0)
      dt = 0;
    holder = (time_t) dt;
+ #ifdef macintosh
+   delta = localtime(&holder);
+ #else
    delta = gmtime(&holder);
+ #endif
    if (delta->tm_yday > 0) {
      sprintf(buf, "%dd %02d:%02d",
  /*   sprintf(buf, "%d:%02d:%02d", */
***************
*** 4188,4194 ****
--- 4192,4202 ----
    if (dt < 0)
      dt = 0;
  
+ #ifdef macintosh
+   delta = localtime((time_t *) & dt);
+ #else
    delta = gmtime((time_t *) & dt);
+ #endif
    if (delta->tm_yday > 0) {
      sprintf(buf, "%dd", delta->tm_yday);
    } else if (delta->tm_hour > 0) {
***************
*** 4360,4366 ****
      if (d->connected && (d->player == player))
        num++;
    if (num < 2) {
- 
      sprintf(tbuf1, T("%s has disconnected."), Name(player));
  
      if (!Dark(player))
--- 4368,4373 ----
***************
*** 4407,4415 ****
      }
      Toggles(player) &= ~PLAYER_CONNECT;
      (void) atr_add(player, "LASTLOGOUT", p, GOD, NOTHING);
- 
-     sprintf(tbuf1, Dark(player) ? T("%s has DARK-disconnected.") :
- 	    T("%s has disconnected."), Name(player));
    } else {
      /* note: when you partially disconnect, ADISCONNECTS are not executed */
      sprintf(tbuf1, T("%s has partially disconnected."), Name(player));
--- 4414,4419 ----
***************
*** 4419,4437 ****
      /* notify contents */
      notify_except(Contents(player), player, tbuf1);
    }
-   /* now print messages */
-   if (Suspect(player))
-     flag_broadcast(WIZARD, 0, T("GAME: Suspect %s"), tbuf1);
- 
-   if (Dark(player)) {
- #ifdef ROYALTY_FLAG
-     flag_broadcast(WIZARD | ROYALTY, PLAYER_MONITOR, "%s %s", T("GAME:"),
- 		   tbuf1);
- #else
-     flag_broadcast(WIZARD, PLAYER_MONITOR, "%s %s", T("GAME:"), tbuf1);
- #endif
-   } else
-     flag_broadcast(0, PLAYER_MONITOR, "%s %s", T("GAME:"), tbuf1);
  
    /* tell players on channel that someone's left */
  #ifdef CHAT_SYSTEM
--- 4423,4428 ----
***************
*** 4446,4451 ****
--- 4437,4466 ----
      }
    }
  #endif				/* CHAT_SYSTEM */
+ 
+   /* Monitor broadcasts */
+   /* Redundant, but better for translators */
+   if (Dark(player)) {
+     sprintf(tbuf1, (num < 2) ? T("%s has DARK-disconnected.") :
+ 	    T("%s has partially DARK-disconnected."), Name(player));
+   } else if (hidden(player)) {
+     sprintf(tbuf1, (num < 2) ? T("%s has HIDDEN-disconnected.") :
+ 	    T("%s has partially HIDDEN-disconnected."), Name(player));
+   } else {
+     sprintf(tbuf1, (num < 2) ? T("%s has disconnected.") :
+ 	    T("%s has partially disconnected."), Name(player));
+   }
+   if (Suspect(player))
+     flag_broadcast(WIZARD, 0, T("GAME: Suspect %s"), tbuf1);
+   if (Dark(player)) {
+ #ifdef ROYALTY_FLAG
+     flag_broadcast(WIZARD | ROYALTY, PLAYER_MONITOR, "%s %s", T("GAME:"),
+ 		   tbuf1);
+ #else
+     flag_broadcast(WIZARD, PLAYER_MONITOR, "%s %s", T("GAME:"), tbuf1);
+ #endif
+   } else
+     flag_broadcast(0, PLAYER_MONITOR, "%s %s", T("GAME:"), tbuf1);
  }
  
  void
*** 1_7_4.72/hdrs/version.h Fri, 23 Mar 2001 14:12:35 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.3 660)
--- 1_7_4.81(w)/hdrs/version.h Mon, 23 Apr 2001 18:06:27 -0500 dunemush (pennmush/c/47_version.h 1.32.1.2.1.6 660)
***************
*** 1,2 ****
! #define VERSION "PennMUSH version 1.7.4 patchlevel 2 [03/23/2001]"
! #define SHORTVN "PennMUSH 1.7.4p2"
--- 1,2 ----
! #define VERSION "PennMUSH version 1.7.4 patchlevel 3 [04/23/2001]"
! #define SHORTVN "PennMUSH 1.7.4p3"