This is patch08 to PennMUSH 1.7.2. After applying this patch, you will
have version 1.7.2p8. 

To apply this patch, save it to a file in your top-level MUSH directory,
and do the following:
	patch -p0 < 1.7.2-patch08	
	make

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

Then @shutdown and restart your MUSH.

In this patch:
 Many bugfixes!

 - Alan/Javelin


Index: Patchlevel
Prereq: 1.7.2p7
*** Patchlevel.orig Wed, 11 Mar 1998 09:24:40 -0600 dunemush (pennmush/h/12_Patchlevel 1.8 640) 0.23
--- Patchlevel      Fri, 13 Mar 1998 10:00:14 -0600 dunemush (pennmush/h/12_Patchlevel 1.8 640) 0.23(w)
***************
*** 1,2 ****
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.2p7
--- 1,2 ----
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.2p8
Index: CHANGES
*** CHANGES.orig Wed, 11 Mar 1998 09:24:40 -0600 dunemush (pennmush/h/9_CHANGES 1.10.1.1.1.1 640) 0.23
--- CHANGES      Tue, 14 Apr 1998 14:09:16 -0500 dunemush (pennmush/h/9_CHANGES 1.10.1.1.1.1 640) 0.23(w)
***************
*** 15,20 ****
--- 15,51 ----
  
  ==========================================================================
  
+ Version 1.7.2 patchlevel 8                    April 2, 1998
+ 
+ Fixes: 
+       * round() could crash on very big numbers on some systems.
+         Reported by Atuarre@ATS.
+       * Problem with exits getting a contents list in certain 
+         conditions fixed. Reported by Atuarre@ATS. [TAP]
+       * Problems with puppets and Pueblo fixed. Report by Mop-Boy.
+       * mkindx problem with dos text files fixed. [NJG]
+       * Order of include files in htab.c was wrong, caused compilation
+         problems on SCO Openserver. Reported by Flame.
+       * On Win32, the MUSH could quit without flushing its buffers. [NJG]
+       * When inside of an object with @listen *, you didn't see things
+         when the object did a 'look'. Reported by Vedui.
+       * Warnings in rwho.c eliminated. [NJG]
+       * More fooling around with mymalloc.h to help the Win32 compile.
+         Suggested by NJG.
+       * open_everywhere power get left off help powers list at some point.
+         Reported by Steven@Champions.
+       * Error message for joining a non-existant channel was different
+         from that for joining a channel that exists but you can't
+         see. Reported by Octavian@M*U*S*H.
+       * get()'ing an attribute that isn't set now returns an error 
+         message only if the default permissions don't allow you to 
+         get it. This allows get(player/ALIAS) to always work, returning
+         an empty string if the player has no ALIAS. [TAP].
+       * base_room mush.cnf option got left out.
+       * dbck didn't check for disconnected rooms correctly. Noted by
+         Rhysem.
+ 
+ 
  Version 1.7.2 patchlevel 7                    March 10, 1998
  
  Fixes:
Index: hdrs/conf.h
*** hdrs/conf.h.orig Fri, 13 Feb 1998 14:31:28 -0600 dunemush (pennmush/d/49_conf.h 1.1 640) 0.23
--- hdrs/conf.h      Thu, 19 Mar 1998 10:07:32 -0600 dunemush (pennmush/d/49_conf.h 1.1 640) 0.23(w)
***************
*** 413,430 ****
  
  #define exit(arg) Win32_Exit (arg)
  void Win32_Exit(int exit_code);
- #define malloc(arg) Win32_malloc (arg)
- #define calloc(arg1, arg2) Win32_calloc (arg1, arg2)
- #define realloc(arg1, arg2) Win32_realloc (arg1, arg2)
- #define free(arg) Win32_free (arg)
- void *Win32_malloc(unsigned int size);
- void *Win32_calloc(unsigned int num, unsigned int size);
- void *Win32_realloc(void *memblock, unsigned int size);
- void Win32_free(void *memblock);
- void Win32_return_memory_used(long *mallocs,
- 			      long *frees,
- 			      long *allocated,
- 			      long *freed);
  #endif				/* WIN32 */
  
  #endif				/* __OPTIONS_H */
--- 413,418 ----
Index: hdrs/externs.h
*** hdrs/externs.h.orig Wed, 11 Mar 1998 09:24:40 -0600 dunemush (pennmush/e/1_externs.h 1.4 640) 0.23
--- hdrs/externs.h      Thu, 19 Mar 1998 12:12:05 -0600 dunemush (pennmush/e/1_externs.h 1.3.1.2 640) 0.23(w)
***************
*** 107,112 ****
--- 107,113 ----
  #endif
  
  #define notify(p,m)           notify_anything(orator, na_one, (void *)p, NULL, 0, m)
+ #define notify_by(t,p,m)           notify_anything(t, na_one, (void *)p, NULL, 0, m)
  #define notify_noecho(p,m)    notify_anything(orator, na_one, (void *)p, NULL, NA_NORELAY | NA_PUPPET, m)
  #define quiet_notify(p,m)     if (!IsQuiet(p)) notify(p,m)
  
Index: hdrs/mymalloc.h
*** hdrs/mymalloc.h.orig Mon, 16 Feb 1998 14:44:40 -0600 dunemush (pennmush/e/16_mymalloc.h 1.2 640) 0.23
--- hdrs/mymalloc.h      Thu, 19 Mar 1998 10:07:06 -0600 dunemush (pennmush/e/16_mymalloc.h 1.2 640) 0.23(w)
***************
*** 11,16 ****
--- 11,35 ----
  
  #include "options.h"
  
+ #ifdef WIN32
+ #undef malloc
+ #undef calloc
+ #undef realloc
+ #undef free
+ #define malloc(arg) Win32_malloc (arg)
+ #define calloc(arg1, arg2) Win32_calloc (arg1, arg2)
+ #define realloc(arg1, arg2) Win32_realloc (arg1, arg2)
+ #define free(arg) Win32_free (arg)
+ void *Win32_malloc(unsigned int size);
+ void *Win32_calloc(unsigned int num, unsigned int size);
+ void *Win32_realloc(void *memblock, unsigned int size);
+ void Win32_free(void *memblock);
+ void Win32_return_memory_used(long *mallocs,
+ 			      long *frees,
+ 			      long *allocated,
+ 			      long *freed);
+ #endif				/* WIN32 */
+ 
  #if (MALLOC_PACKAGE == 1)
  #define CSRI
  #endif
Index: hdrs/version.h
*** hdrs/version.h.orig Wed, 11 Mar 1998 09:24:40 -0600 dunemush (pennmush/e/22_version.h 1.8 640) 0.23
--- hdrs/version.h      Tue, 07 Apr 1998 12:48:30 -0500 dunemush (pennmush/e/22_version.h 1.8 640) 0.23(w)
***************
*** 1,2 ****
! #define VERSION "PennMUSH version 1.7.2 patchlevel 7 [3/10/98]"
! #define SHORTVN "PennMUSH 1.7.2p7"
--- 1,2 ----
! #define VERSION "PennMUSH version 1.7.2 patchlevel 8 [4/2/98]"
! #define SHORTVN "PennMUSH 1.7.2p8"
Index: src/bsd.c
*** src/bsd.c.orig Sun, 08 Mar 1998 11:37:13 -0600 dunemush (pennmush/e/30_bsd.c 1.6.1.1 640) 0.23
--- src/bsd.c      Tue, 07 Apr 1998 13:12:01 -0500 dunemush (pennmush/e/30_bsd.c 1.6.1.1 640) 0.23(w)
***************
*** 1125,1131 ****
        safe_chr(' ', tbuf1, &bp);
        safe_str(message, tbuf1, &bp);
        *bp = 0;
!       notify_anything(speaker, na_one, (void *) Owner(target), NULL, flags & NA_NORELAY, tbuf1);
      }
      if ((flags & NA_NOLISTEN)
  	|| (!PLAYER_LISTEN && (Typeof(target) == TYPE_PLAYER))
--- 1125,1131 ----
        safe_chr(' ', tbuf1, &bp);
        safe_str(message, tbuf1, &bp);
        *bp = 0;
!       notify_anything(speaker, na_one, (void *) Owner(target), NULL, flags | NA_NORELAY, tbuf1);
      }
      if ((flags & NA_NOLISTEN)
  	|| (!PLAYER_LISTEN && (Typeof(target) == TYPE_PLAYER))
***************
*** 1178,1184 ****
  	      wenv[j] = wsave[j];
  	  }
  	  notify_anything(speaker, IS(target, TYPE_THING, THING_PUPPET) ? na_except2 : na_except,
! 	     passalong, NULL, flags & NA_NORELAY, (a) ? tbuf1 : message);
  	}
        }
      }
--- 1178,1184 ----
  	      wenv[j] = wsave[j];
  	  }
  	  notify_anything(speaker, IS(target, TYPE_THING, THING_PUPPET) ? na_except2 : na_except,
! 	     passalong, NULL, flags | NA_NORELAY, (a) ? tbuf1 : message);
  	}
        }
      }
***************
*** 2641,2647 ****
  {
    if (*userstring) {
      mush_free((Malloc_t) * userstring, "userstring");
!     *userstring = 0;
    }
    while (*command && isascii(*command) && isspace(*command))
      command++;
--- 2641,2647 ----
  {
    if (*userstring) {
      mush_free((Malloc_t) * userstring, "userstring");
!     *userstring = NULL;
    }
    while (*command && isascii(*command) && isspace(*command))
      command++;
Index: src/conf.c
*** src/conf.c.orig Sun, 08 Mar 1998 11:37:13 -0600 dunemush (pennmush/e/37_conf.c 1.2.1.1 640) 0.23
--- src/conf.c      Wed, 08 Apr 1998 13:58:16 -0500 dunemush (pennmush/e/37_conf.c 1.2.1.1 640) 0.23(w)
***************
*** 61,66 ****
--- 61,67 ----
    {"mail_database", cf_str, (int *) options.mail_db, 256, 0, "files"},
    {"player_start", cf_int, &options.player_start, 100000, 0, "db"},
    {"master_room", cf_int, &options.master_room, 100000, 0, "db"},
+   {"base_room", cf_int, &options.base_room, 100000, 0, "db"},
    {"idle_timeout", cf_int, &options.idle_timeout, 100000, 0, "limits"},
    {"dump_interval", cf_int, &options.dump_interval, 100000, 0, "dump"},
    {"dump_message", cf_str, (int *) options.dump_message, 256, 0, "dump"},
***************
*** 414,419 ****
--- 415,421 ----
    strcpy(options.mail_db, "data/maildb.Z");
    options.player_start = 0;
    options.master_room = 2;
+   options.base_room = 0;
    options.idle_timeout = 10801;
    options.dump_interval = 3601;
    strcpy(options.dump_message, "GAME: Dumping database. Game may freeze for a minute");
Index: src/destroy.c
*** src/destroy.c.orig Fri, 13 Feb 1998 14:32:30 -0600 dunemush (pennmush/e/44_destroy.c 1.1 640) 0.23
--- src/destroy.c      Mon, 13 Apr 1998 08:56:58 -0500 dunemush (pennmush/e/44_destroy.c 1.1 640) 0.23(w)
***************
*** 602,614 ****
    do_halt(thing, "", thing);
    nfy_que(thing, 2, 0);		/* The equivalent of an @drain. */
  
!   /* if something is zoned or parented to destroyed object, undo */
    for (i = 0; i < db_top; i++) {
      if (Zone(i) == thing) {
        Zone(i) = NOTHING;
      }
      if (Parent(i) == thing) {
!       db[i].parent = NOTHING;
      }
    }
  
--- 602,662 ----
    do_halt(thing, "", thing);
    nfy_que(thing, 2, 0);		/* The equivalent of an @drain. */
  
!   /* if something is zoned or parented or linked or chained or located
!    * to/in destroyed object, undo */
    for (i = 0; i < db_top; i++) {
      if (Zone(i) == thing) {
        Zone(i) = NOTHING;
      }
      if (Parent(i) == thing) {
!       Parent(i) = NOTHING;
!     }
!     if (Home(i) == thing) {
!       switch (Typeof(i)) {
!       case TYPE_PLAYER:
!       case TYPE_THING:
! 	Home(i) = PLAYER_START;
! 	break;
!       case TYPE_EXIT:
! 	/* Huh.  An exit that claims to be from here, but wasn't linked
! 	 * in properly. */
! 	do_rawlog(LT_ERR, "ERROR: Exit %s leading from invalid room #%d destroyed.",
! 		  real_unparse(GOD, i, 0), thing);
! 	free_object(i);
! 	break;
!       case TYPE_ROOM:
! 	/* Hrm.  It claims we're an exit from it, but we didn't agree.
! 	 * Clean it up anyway. */
! 	do_log(LT_ERR, NOTHING, NOTHING,
! 	       "Found a destroyed exit #%d in room #%d", thing, i);
! 	break;
!       }
!     }
!     /* The location check MUST be done AFTER the home check. */
!     if (Location(i) == thing) {
!       switch (Typeof(i)) {
!       case TYPE_PLAYER:
!       case TYPE_THING:
! 	/* Huh.  It thought it was here, but we didn't agree. */
! 	enter_room(i, Home(i));
! 	break;
!       case TYPE_EXIT:
! 	/* If our destination is destroyed, then we relink to the
! 	 * source room (so that the exit can't be stolen). Yes, it's
! 	 * inconsistent with the treatment of exits leading from
! 	 * destroyed rooms, but it's a lot better than turning exits
! 	 * into nasty limbo exits.
! 	 */
! 	Destination(i) = Source(i);
! 	break;
!       case TYPE_ROOM:
! 	/* Just remove a dropto. */
! 	Location(i) = NOTHING;
! 	break;
!       }
!     }
!     if (Next(i) == thing) {
!       Next(i) = NOTHING;
      }
    }
  
***************
*** 665,671 ****
        break;
      case TYPE_THING:		/* move to home */
      case TYPE_PLAYER:
!       if (Home(first) == thing)
  	Home(first) = PLAYER_START;
        if (Home(first) != NOTHING) {
  	PUSH(first, Contents(Home(first)));
--- 713,719 ----
        break;
      case TYPE_THING:		/* move to home */
      case TYPE_PLAYER:
!       if (Home(first) == thing || Typeof(Home(first)) == TYPE_EXIT)
  	Home(first) = PLAYER_START;
        if (Home(first) != NOTHING) {
  	PUSH(first, Contents(Home(first)));
***************
*** 935,944 ****
        switch (Typeof(thing)) {
        case TYPE_PLAYER:
        case TYPE_THING:
! 	if (GoodObject(home) && Destroyed(loc)) {
  	  Home(thing) = PLAYER_START;
  	}
! 	if (GoodObject(loc) && Destroyed(loc)) {
  	  enter_room(thing, Home(thing));
  	}
  	break;
--- 983,996 ----
        switch (Typeof(thing)) {
        case TYPE_PLAYER:
        case TYPE_THING:
! 	if (GoodObject(home) &&
! 	    (Destroyed(home) ||
! 	     (Typeof(home) == TYPE_EXIT))) {
  	  Home(thing) = PLAYER_START;
  	}
! 	if (GoodObject(loc) &&
! 	    (Destroyed(loc) ||
! 	     (Typeof(loc) == TYPE_EXIT))) {
  	  enter_room(thing, Home(thing));
  	}
  	break;
***************
*** 967,973 ****
  	  do_log(LT_ERR, NOTHING, NOTHING,
  		 "Found a destroyed exit #%d in room #%d", home, thing);
  	}
! 	if (GoodObject(loc) && Destroyed(loc)) {
  	  /* Just remove a dropto. */
  	  Location(thing) = NOTHING;
  	}
--- 1019,1027 ----
  	  do_log(LT_ERR, NOTHING, NOTHING,
  		 "Found a destroyed exit #%d in room #%d", home, thing);
  	}
! 	if (GoodObject(loc) &&
! 	    (Destroyed(loc) ||
! 	     (Typeof(loc) == TYPE_EXIT))) {
  	  /* Just remove a dropto. */
  	  Location(thing) = NOTHING;
  	}
***************
*** 1014,1020 ****
  				     object_header(Owner(loc), loc)));
  	} else
  	  do_log(LT_ERR, NOTHING, NOTHING, "ERROR: no name for room #%d.", loc);
- 	return;
        }
      }
  }
--- 1068,1073 ----
Index: src/extchat.c
*** src/extchat.c.orig Wed, 04 Mar 1998 10:11:19 -0600 dunemush (pennmush/e/45_extchat.c 1.5 640) 0.23
--- src/extchat.c      Fri, 13 Mar 1998 10:43:26 -0600 dunemush (pennmush/e/45_extchat.c 1.5 640) 0.23(w)
***************
*** 717,725 ****
    test_channel(player, name, chan);
    if (!Chan_Can_See(chan, player)) {
      if (onchannel(player, chan))
!       notify(player, "You can't do that with that channel.");
      else
!       notify(player, "I don't recognize that channel.");
      return;
    }
    if (!strcasecmp(com, "who")) {
--- 717,725 ----
    test_channel(player, name, chan);
    if (!Chan_Can_See(chan, player)) {
      if (onchannel(player, chan))
!       notify(player, "CHAT: You can't do that with that channel.");
      else
!       notify(player, "CHAT: I don't recognize that channel.");
      return;
    }
    if (!strcasecmp(com, "who")) {
***************
*** 921,927 ****
      return;
    }
    if (!Chan_Can_See(chan, player)) {
!     notify(player, "I don't recognize that channel.");
      return;
    }
    if (!msg || !*msg) {
--- 921,927 ----
      return;
    }
    if (!Chan_Can_See(chan, player)) {
!     notify(player, "CHAT: I don't recognize that channel.");
      return;
    }
    if (!msg || !*msg) {
Index: src/fundb.c
*** src/fundb.c.orig Mon, 16 Feb 1998 10:19:07 -0600 dunemush (pennmush/e/51_fundb.c 1.2 640) 0.23
--- src/fundb.c      Sun, 15 Mar 1998 08:25:59 -0600 dunemush (pennmush/e/51_fundb.c 1.2 640) 0.23(w)
***************
*** 50,61 ****
    char const *value;
  
    a = atr_get(thing, upcasestr(attrib));
!   if (a && Can_Read_Attr(executor, thing, a)) {
!     if (strlen(value = uncompress(a->value)) < BUFFER_LEN)
!       return (char *) value;
!     else
!       return (char *) "#-1 ATTRIBUTE LENGTH TOO LONG";
!   } else if (a || !Can_Examine(executor, thing))
      return (char *) "#-1 NO PERMISSION TO GET ATTRIBUTE";
    return (char *) "";
  }
--- 50,73 ----
    char const *value;
  
    a = atr_get(thing, upcasestr(attrib));
!   if (a) {
!     if (Can_Read_Attr(executor, thing, a)) {
!       if (strlen(value = uncompress(a->value)) < BUFFER_LEN)
! 	return (char *) value;
!       else
! 	return (char *) "#-1 ATTRIBUTE LENGTH TOO LONG";
!     }
!     return (char *) "#-1 NO PERMISSION TO GET ATTRIBUTE";
!   }
! 
!   a = atr_match(upcasestr(attrib));
!   if (a) {
!     if (Can_Read_Attr(executor, thing, a))
!       return (char *) "";
!     return (char *) "#-1 NO PERMISSION TO GET ATTRIBUTE";
!   }
! 
!   if (!Can_Examine(executor, thing))
      return (char *) "#-1 NO PERMISSION TO GET ATTRIBUTE";
    return (char *) "";
  }
Index: src/funmath.c
*** src/funmath.c.orig Mon, 23 Feb 1998 14:31:54 -0600 dunemush (pennmush/f/1_funmath.c 1.2 640) 0.23
--- src/funmath.c      Mon, 13 Apr 1998 09:03:43 -0500 dunemush (pennmush/f/1_funmath.c 1.2 640) 0.23(w)
***************
*** 717,723 ****
  /* ARGSUSED */
  FUNCTION(fun_round)
  {
!   char temp[30];
    const char *fstr;
    int places;
  
--- 717,723 ----
  /* ARGSUSED */
  FUNCTION(fun_round)
  {
!   char temp[BUFFER_LEN];
    const char *fstr;
    int places;
  
Index: src/look.c
*** src/look.c.orig Wed, 11 Mar 1998 09:24:40 -0600 dunemush (pennmush/f/12_look.c 1.2 640) 0.23
--- src/look.c      Tue, 07 Apr 1998 13:26:59 -0500 dunemush (pennmush/f/12_look.c 1.1.1.2 640) 0.23(w)
***************
*** 102,108 ****
      process_expression(buff, &bp, &sp, loc, player, player,
  		       PE_DEFAULT, PT_DEFAULT, NULL);
      *bp = '\0';
!     notify(player, buff);
      for (j = 0; j < 10; j++) {
        wenv[j] = wsave[j];
      }
--- 102,108 ----
      process_expression(buff, &bp, &sp, loc, player, player,
  		       PE_DEFAULT, PT_DEFAULT, NULL);
      *bp = '\0';
!     notify_by(loc, player, buff);
      for (j = 0; j < 10; j++) {
        wenv[j] = wsave[j];
      }
***************
*** 150,156 ****
    PUSE;
    tag_wrap("FONT", "SIZE=+1", exit_name);
    PEND;
!   notify(player, pbuff);
  
    for (; thing != NOTHING; thing = Next(thing)) {
      if (Name(thing) && !Dark(thing) && (!Dark(loc) || Light(thing))) {
--- 150,156 ----
    PUSE;
    tag_wrap("FONT", "SIZE=+1", exit_name);
    PEND;
!   notify_by(loc, player, pbuff);
  
    for (; thing != NOTHING; thing = Next(thing)) {
      if (Name(thing) && !Dark(thing) && (!Dark(loc) || Light(thing))) {
***************
*** 212,218 ****
      notify_noenter(player, pbuff);
    }
    *s2 = '\0';
!   notify(player, tbuf2);
  }
  
  
--- 212,218 ----
      notify_noenter(player, pbuff);
    }
    *s2 = '\0';
!   notify_by(loc, player, tbuf2);
  }
  
  
***************
*** 260,266 ****
      process_expression(buff, &bp, &sp, loc, player, player,
  		       PE_DEFAULT, PT_DEFAULT, NULL);
      *bp = '\0';
!     notify(player, buff);
      for (j = 0; j < 10; j++) {
        wenv[j] = wsave[j];
      }
--- 260,266 ----
      process_expression(buff, &bp, &sp, loc, player, player,
  		       PE_DEFAULT, PT_DEFAULT, NULL);
      *bp = '\0';
!     notify_by(loc, player, buff);
      for (j = 0; j < 10; j++) {
        wenv[j] = wsave[j];
      }
***************
*** 268,274 ****
      return;
    }
    /* check to see if there is anything there */
!   DOLIST(thing, db[loc].contents) {
      if (can_see(player, thing, can_see_loc)) {
        /* something exists!  show him everything */
        PUSE;
--- 268,274 ----
      return;
    }
    /* check to see if there is anything there */
!   DOLIST(thing, Contents(loc)) {
      if (can_see(player, thing, can_see_loc)) {
        /* something exists!  show him everything */
        PUSE;
***************
*** 276,288 ****
        tag("UL");
        PEND;
        notify_nopenter(player, pbuff);
!       DOLIST(thing, db[loc].contents) {
  	if (can_see(player, thing, can_see_loc)) {
  	  PUSE;
  	  tag("LI");
  	  tag_wrap("A", tprintf("XCH_CMD=\"look #%d\"", thing), real_unparse(player, thing, 1));
  	  PEND;
! 	  notify(player, pbuff);
  	}
        }
        PUSE;
--- 276,288 ----
        tag("UL");
        PEND;
        notify_nopenter(player, pbuff);
!       DOLIST(thing, Contents(loc)) {
  	if (can_see(player, thing, can_see_loc)) {
  	  PUSE;
  	  tag("LI");
  	  tag_wrap("A", tprintf("XCH_CMD=\"look #%d\"", thing), real_unparse(player, thing, 1));
  	  PEND;
! 	  notify_by(loc, player, pbuff);
  	}
        }
        PUSE;
***************
*** 354,363 ****
      if (ShowAnsi(player)) {
        notify(player,
  	     tprintf("%s%s [#%d%s]:%s %s", ANSI_HILITE, AL_NAME(atr),
! 		     db[AL_CREATOR(atr)].owner, fbuf, ANSI_NORMAL, r));
      } else {
        notify(player, tprintf("%s [#%d%s]: %s", AL_NAME(atr),
! 			     db[AL_CREATOR(atr)].owner, fbuf, r));
      }
    }
    free((Malloc_t) r);
--- 354,363 ----
      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);
***************
*** 400,406 ****
      flag = 4;
    if (flag) {
      if (Location(thing) == HOME)
!       look_room(player, db[player].exits, flag);
      else if (GoodObject(thing) && GoodObject(Location(thing)))
        look_room(player, Location(thing), flag);
    }
--- 400,406 ----
      flag = 4;
    if (flag) {
      if (Location(thing) == HOME)
!       look_room(player, Exits(player), flag);
      else if (GoodObject(thing) && GoodObject(Location(thing)))
        look_room(player, Location(thing), flag);
    }
***************
*** 441,447 ****
      tag("HR");
      tag_wrap("FONT", "SIZE=+3", unparse_object(player, loc));
      PEND;
!     notify(player, pbuff);
    }
    if (Typeof(loc) != TYPE_ROOM) {
      if ((flag != 2) || !Terse(player)) {
--- 441,447 ----
      tag("HR");
      tag_wrap("FONT", "SIZE=+3", unparse_object(player, loc));
      PEND;
!     notify_by(loc, player, pbuff);
    }
    if (Typeof(loc) != TYPE_ROOM) {
      if ((flag != 2) || !Terse(player)) {
***************
*** 687,697 ****
    if (ok) {
      notify(player,
  	   tprintf("Owner: %s  Zone: %s  %s: %d",
! 		   db[db[thing].owner].name,
  		   object_header(player, Zone(thing)),
  		   MONIES, Pennies(thing)));
      notify(player, tprintf("Parent: %s",
! 			   object_header(player, db[thing].parent)));
      {
        struct lock_list *ll;
        for (ll = Locks(thing); ll; ll = ll->next) {
--- 687,697 ----
    if (ok) {
      notify(player,
  	   tprintf("Owner: %s  Zone: %s  %s: %d",
! 		   Name(Owner(thing)),
  		   object_header(player, Zone(thing)),
  		   MONIES, Pennies(thing)));
      notify(player, tprintf("Parent: %s",
! 			   object_header(player, Parent(thing))));
      {
        struct lock_list *ll;
        for (ll = Locks(thing); ll; ll = ll->next) {
***************
*** 755,763 ****
    switch (Typeof(thing)) {
    case TYPE_ROOM:
      /* tell him about exits */
!     if (db[thing].exits != NOTHING) {
        notify(player, "Exits:");
!       DOLIST(exit_dbref, db[thing].exits)
  	notify(player, object_header(player, exit_dbref));
      } else
        notify(player, "No exits.");
--- 755,763 ----
    switch (Typeof(thing)) {
    case TYPE_ROOM:
      /* tell him about exits */
!     if (Exits(thing) != NOTHING) {
        notify(player, "Exits:");
!       DOLIST(exit_dbref, Exits(thing))
  	notify(player, object_header(player, exit_dbref));
      } else
        notify(player, "No exits.");
***************
*** 773,779 ****
      /* print home */
      notify(player,
  	   tprintf("Home: %s",
! 		   object_header(player, db[thing].exits)));	/* home */
      /* print location if player can link to it */
      if (Location(thing) != NOTHING)
        notify(player,
--- 773,779 ----
      /* print home */
      notify(player,
  	   tprintf("Home: %s",
! 		   object_header(player, Exits(thing))));	/* home */
      /* print location if player can link to it */
      if (Location(thing) != NOTHING)
        notify(player,
***************
*** 782,788 ****
      break;
    case TYPE_EXIT:
      /* print source */
!     switch (db[thing].exits) {
      case NOTHING:
        fprintf(stderr,
  	"*** BLEAH *** Weird exit %s(#%d) in #%d with source NOTHING.\n",
--- 782,788 ----
      break;
    case TYPE_EXIT:
      /* print source */
!     switch (Exits(thing)) {
      case NOTHING:
        fprintf(stderr,
  	"*** BLEAH *** Weird exit %s(#%d) in #%d with source NOTHING.\n",
***************
*** 801,807 ****
      default:
        notify(player,
  	     tprintf("Source: %s",
! 		     object_header(player, db[thing].exits)));
        break;
      }
      /* print destination */
--- 801,807 ----
      default:
        notify(player,
  	     tprintf("Source: %s",
! 		     object_header(player, Exits(thing))));
        break;
      }
      /* print destination */
***************
*** 885,891 ****
  
    for (i = bot; i < top; i++) {
      if ((Typeof(i) != TYPE_EXIT) && controls(player, i) &&
! 	(!*name || string_match(db[i].name, name))) {
        notify(player, object_header(player, i));
        count++;
      }
--- 885,891 ----
  
    for (i = bot; i < top; i++) {
      if ((Typeof(i) != TYPE_EXIT) && controls(player, i) &&
! 	(!*name || string_match(Name(i), name))) {
        notify(player, object_header(player, i));
        count++;
      }
***************
*** 901,907 ****
  {
    char tbuf1[BUFFER_LEN];
    char *p;
!   dbref here = db[player].location;
    int connect_flag = 0;
    int here_flag = 0;
    int inven_flag = 0;
--- 901,907 ----
  {
    char tbuf1[BUFFER_LEN];
    char *p;
!   dbref here = Location(player);
    int connect_flag = 0;
    int here_flag = 0;
    int inven_flag = 0;
***************
*** 934,940 ****
  	  notify(player, tprintf("%s is listening", Name(here)));
  	} else {
  	  notify(player, tprintf("%s [owner: %s] is listening.",
! 				 Name(here), db[Owner(here)].name));
  	}
        }
      } else {
--- 934,940 ----
  	  notify(player, tprintf("%s is listening", Name(here)));
  	} else {
  	  notify(player, tprintf("%s [owner: %s] is listening.",
! 				 Name(here), Name(Owner(here))));
  	}
        }
      } else {
***************
*** 952,958 ****
  			       Name(here)));
      }
  
!     for (here = db[here].contents; here != NOTHING; here = db[here].next) {
        if (connect_flag) {
  	/* only worry about puppet and players who's owner's are connected */
  	if (Connected(here) || (Puppet(here) && Connected(Owner(here)))) {
--- 952,958 ----
  			       Name(here)));
      }
  
!     for (here = Contents(here); here != NOTHING; here = Next(here)) {
        if (connect_flag) {
  	/* only worry about puppet and players who's owner's are connected */
  	if (Connected(here) || (Puppet(here) && Connected(Owner(here)))) {
***************
*** 960,966 ****
  	    notify(player, tprintf("%s is listening", Name(here)));
  	  } else {
  	    notify(player, tprintf("%s [owner: %s] is listening.",
! 				   Name(here), db[Owner(here)].name));
  	  }
  	}
        } else {
--- 960,966 ----
  	    notify(player, tprintf("%s is listening", Name(here)));
  	  } else {
  	    notify(player, tprintf("%s [owner: %s] is listening.",
! 				   Name(here), Name(Owner(here))));
  	  }
  	}
        } else {
***************
*** 978,988 ****
    if (!connect_flag && !inven_flag &&
        (Typeof(Location(player)) == TYPE_ROOM)) {
      notify(player, "Listening EXITS:");
!     if (db[Location(player)].flags & AUDIBLE) {
        /* listening exits only work if the room is AUDIBLE */
!       for (here = db[Location(player)].exits; here != NOTHING;
! 	   here = db[here].next) {
! 	if (db[here].flags & AUDIBLE) {
  	  strcpy(tbuf1, Name(here));
  	  for (p = tbuf1; *p && (*p != ';'); p++) ;
  	  *p = '\0';
--- 978,988 ----
    if (!connect_flag && !inven_flag &&
        (Typeof(Location(player)) == TYPE_ROOM)) {
      notify(player, "Listening EXITS:");
!     if (Flags(Location(player)) & AUDIBLE) {
        /* listening exits only work if the room is AUDIBLE */
!       for (here = Exits(Location(player)); here != NOTHING;
! 	   here = Next(here)) {
! 	if (Flags(here) & AUDIBLE) {
  	  strcpy(tbuf1, Name(here));
  	  for (p = tbuf1; *p && (*p != ';'); p++) ;
  	  *p = '\0';
***************
*** 994,1000 ****
    if (!here_flag && !exit_flag) {
      notify(player, "Listening in your INVENTORY:");
  
!     for (here = Contents(player); here != NOTHING; here = db[here].next) {
        if (connect_flag) {
  	/* only worry about puppet and players who's owner's are connected */
  	if (Connected(here) || (Puppet(here) && Connected(Owner(here)))) {
--- 994,1000 ----
    if (!here_flag && !exit_flag) {
      notify(player, "Listening in your INVENTORY:");
  
!     for (here = Contents(player); here != NOTHING; here = Next(here)) {
        if (connect_flag) {
  	/* only worry about puppet and players who's owner's are connected */
  	if (Connected(here) || (Puppet(here) && Connected(Owner(here)))) {
***************
*** 1002,1008 ****
  	    notify(player, tprintf("%s is listening", Name(here)));
  	  } else {
  	    notify(player, tprintf("%s [owner: %s] is listening.",
! 				   Name(here), db[Owner(here)].name));
  	  }
  	}
        } else {
--- 1002,1008 ----
  	    notify(player, tprintf("%s is listening", Name(here)));
  	  } else {
  	    notify(player, tprintf("%s [owner: %s] is listening.",
! 				   Name(here), Name(Owner(here))));
  	  }
  	}
        } else {
***************
*** 1036,1042 ****
    if (!Can_Locate(player, thing)) {
      notify(player, "That player wishes to have some privacy.");
      notify(thing, tprintf("%s tried to locate you and failed.",
! 			  db[player].name));
      return;
    }
    notify(player,
--- 1036,1042 ----
    if (!Can_Locate(player, thing)) {
      notify(player, "That player wishes to have some privacy.");
      notify(thing, tprintf("%s tried to locate you and failed.",
! 			  Name(player)));
      return;
    }
    notify(player,
***************
*** 1045,1051 ****
    if (!See_All(player))
      notify(thing,
  	   tprintf("%s has just located your position.",
! 		   db[player].name));
    return;
  
  }
--- 1045,1051 ----
    if (!See_All(player))
      notify(thing,
  	   tprintf("%s has just located your position.",
! 		   Name(player)));
    return;
  
  }
***************
*** 1075,1081 ****
      return;
    }
    if (!where || !*where) {
!     if ((place = db[player].location) == NOTHING)
        return;
    } else {
      if ((place = noisy_match_result(player, where, NOTYPE, MAT_EVERYTHING)) == NOTHING)
--- 1075,1081 ----
      return;
    }
    if (!where || !*where) {
!     if ((place = Location(player)) == NOTHING)
        return;
    } else {
      if ((place = noisy_match_result(player, where, NOTYPE, MAT_EVERYTHING)) == NOTHING)
***************
*** 1329,1337 ****
  
    if (dbflag != 4) {
      if (Mobile(thing)) {
!       if (GoodObject(db[thing].exits))
! 	notify(player, tprintf("@link %s = #%d", object, db[thing].exits));
!       else if (db[thing].exits == HOME)
  	notify(player, tprintf("@link %s = HOME", object));
      } else {
        if (GoodObject(Location(thing)))
--- 1329,1337 ----
  
    if (dbflag != 4) {
      if (Mobile(thing)) {
!       if (GoodObject(Exits(thing)))
! 	notify(player, tprintf("@link %s = #%d", object, Exits(thing)));
!       else if (Exits(thing) == HOME)
  	notify(player, tprintf("@link %s = HOME", object));
      } else {
        if (GoodObject(Location(thing)))
***************
*** 1342,1351 ****
  	notify(player, tprintf("@link %s = HOME", object));
      }
  
!     if (GoodObject(db[thing].zone))
!       notify(player, tprintf("@chzone %s = #%d", object, db[thing].zone));
!     if (GoodObject(db[thing].parent))
!       notify(player, tprintf("@parent %s=#%d", object, db[thing].parent));
  
      decompile_locks(player, thing, object);
      decompile_flags(player, thing, object);
--- 1342,1351 ----
  	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);
Index: src/mkindx.c
*** src/mkindx.c.orig Wed, 04 Mar 1998 10:11:19 -0600 dunemush (pennmush/f/17_mkindx.c 1.3 640) 0.23
--- src/mkindx.c      Tue, 14 Apr 1998 14:06:34 -0500 dunemush (pennmush/f/17_mkindx.c 1.3 640) 0.23(w)
***************
*** 35,43 ****
  void write_topic _((FILE * out, long int p, int l));
  void flush_topics _((FILE * out));
  static void add_topic _((char *name));
! #ifdef EMBEDDED_MKINDX
! 
! #else
  int main _((int argc, char **argv));
  #endif
  
--- 35,41 ----
  void write_topic _((FILE * out, long int p, int l));
  void flush_topics _((FILE * out));
  static void add_topic _((char *name));
! #ifndef EMBEDDED_MKINDX
  int main _((int argc, char **argv));
  #endif
  
***************
*** 149,155 ****
    /* Quietly ignore null values for the file */
    if (!inputfile || !*inputfile || !outputfile || !*outputfile)
      return 0;
!   if ((rfp = fopen(inputfile, "rb")) == NULL) {
      fprintf(stderr, "can't open %s for reading\n", inputfile);
      exit(-1);
    }
--- 147,153 ----
    /* Quietly ignore null values for the file */
    if (!inputfile || !*inputfile || !outputfile || !*outputfile)
      return 0;
!   if ((rfp = fopen(inputfile, "r")) == NULL) {
      fprintf(stderr, "can't open %s for reading\n", inputfile);
      exit(-1);
    }
Index: src/mymalloc.c
*** src/mymalloc.c.orig Sun, 08 Mar 1998 11:37:13 -0600 dunemush (pennmush/f/20_mymalloc.c 1.2 640) 0.23
--- src/mymalloc.c      Thu, 19 Mar 1998 10:04:15 -0600 dunemush (pennmush/f/20_mymalloc.c 1.2 640) 0.23(w)
***************
*** 1,10 ****
  /* A wrapper for the various malloc package options. See options.h
!  * for descriptions of each
   */
! #include "config.h"
! #include "conf.h"
! #include "mymalloc.h"
! #include "confmagic.h"
  
  #if (MALLOC_PACKAGE == 1)
  #include "csrimalloc.c"
--- 1,9 ----
  /* A wrapper for the various malloc package options. See options.h
!  * for descriptions of each.
!  * Each package's source code must include config.h, mymalloc.h,
!  * and confmagic.h.
   */
! #include "options.h"
  
  #if (MALLOC_PACKAGE == 1)
  #include "csrimalloc.c"
Index: src/nmalloc.c
*** src/nmalloc.c.orig Mon, 16 Feb 1998 14:44:40 -0600 dunemush (pennmush/f/21_nmalloc.c 1.2 640) 0.23
--- src/nmalloc.c      Thu, 19 Mar 1998 10:07:16 -0600 dunemush (pennmush/f/21_nmalloc.c 1.2 640) 0.23(w)
***************
*** 19,34 ****
  #include "mymalloc.h"
  #include "confmagic.h"
  
- 
- /* These must appear AFTER the includes, so as to undefine our
-    "interim" routines
-  */
- 
- #undef malloc
- #undef calloc
- #undef realloc
- #undef free
- 
  #define SLONG sizeof (long)
  
  static long malloc_count = 0, free_count = 0, total_mallocked = 0, total_freed = 0;
--- 19,24 ----
Index: src/predicat.c
*** src/predicat.c.orig Sun, 08 Mar 1998 11:37:13 -0600 dunemush (pennmush/f/26_predicat.c 1.2 640) 0.23
--- src/predicat.c      Thu, 19 Mar 1998 12:12:08 -0600 dunemush (pennmush/f/26_predicat.c 1.1.1.2 640) 0.23(w)
***************
*** 196,205 ****
  	process_expression(buff, &bp, &ap, thing, player, player,
  			   PE_DEFAULT, PT_DEFAULT, NULL);
  	*bp = '\0';
! 	notify(player, buff);
  	free((Malloc_t) asave);
        } else if (def && *def)
! 	notify(player, def);
      }
      /* message to neighbors */
      if (!Dark(player)) {
--- 196,205 ----
  	process_expression(buff, &bp, &ap, thing, player, player,
  			   PE_DEFAULT, PT_DEFAULT, NULL);
  	*bp = '\0';
!  	notify_by(thing,player,buff);
  	free((Malloc_t) asave);
        } else if (def && *def)
! 	notify_by(thing,player, def);
      }
      /* message to neighbors */
      if (!Dark(player)) {
Index: src/rob.c
*** src/rob.c.orig Fri, 13 Feb 1998 14:32:30 -0600 dunemush (pennmush/f/28_rob.c 1.1 640) 0.23
--- src/rob.c      Tue, 07 Apr 1998 12:50:59 -0500 dunemush (pennmush/f/28_rob.c 1.1 640) 0.23(w)
***************
*** 184,190 ****
    /* must be giving object */
    if (*s) {
      dbref thing;
!     switch (thing = match_result(player, amnt, TYPE_THING, MAT_ME | MAT_POSSESSION)) {
      case NOTHING:
        notify(player, "You don't have that!");
        return;
--- 184,190 ----
    /* must be giving object */
    if (*s) {
      dbref thing;
!     switch (thing = match_result(player, amnt, TYPE_THING, MAT_POSSESSION)) {
      case NOTHING:
        notify(player, "You don't have that!");
        return;
Index: src/rwho.c
*** src/rwho.c.orig Mon, 23 Feb 1998 14:31:54 -0600 dunemush (pennmush/f/30_rwho.c 1.3 640) 0.23
--- src/rwho.c      Thu, 19 Mar 1998 12:12:09 -0600 dunemush (pennmush/f/30_rwho.c 1.4 640) 0.23(w)
***************
*** 124,130 ****
  
    sprintf(pbuf, "U\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s",
  	  localnam, password, localnam, (int) senttime, comment);
!   sendto(dgramfd, pbuf, strlen(pbuf), 0, &addr, sizeof(addr));
    return (0);
  }
  
--- 124,130 ----
  
    sprintf(pbuf, "U\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s",
  	  localnam, password, localnam, (int) senttime, comment);
!   sendto(dgramfd, pbuf, strlen(pbuf), 0, (struct sockaddr *)&addr, sizeof(addr));
    return (0);
  }
  
***************
*** 140,146 ****
  
    if (dgramfd != -1) {
      sprintf(pbuf, "D\t%.20s\t%.20s\t%.20s", localnam, password, localnam);
!     sendto(dgramfd, pbuf, strlen(pbuf), 0, &addr, sizeof(addr));
      close(dgramfd);
      dgramfd = -1;
      free(password);
--- 140,146 ----
  
    if (dgramfd != -1) {
      sprintf(pbuf, "D\t%.20s\t%.20s\t%.20s", localnam, password, localnam);
!     sendto(dgramfd, pbuf, strlen(pbuf), 0, (struct sockaddr *)&addr, sizeof(addr));
      close(dgramfd);
      dgramfd = -1;
      free(password);
***************
*** 162,168 ****
    if (dgramfd != -1) {
      sprintf(pbuf, "M\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s",
  	    localnam, password, localnam, (int) senttime, lcomment);
!     sendto(dgramfd, pbuf, strlen(pbuf), 0, &addr, sizeof(addr));
    }
    return (0);
  }
--- 162,168 ----
    if (dgramfd != -1) {
      sprintf(pbuf, "M\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s",
  	    localnam, password, localnam, (int) senttime, lcomment);
!     sendto(dgramfd, pbuf, strlen(pbuf), 0, (struct sockaddr *)&addr, sizeof(addr));
    }
    return (0);
  }
***************
*** 183,189 ****
    if (dgramfd != -1) {
      sprintf(pbuf, "A\t%.20s\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.20s",
  	    localnam, password, localnam, uid, (int) tim, name);
!     sendto(dgramfd, pbuf, strlen(pbuf), 0, &addr, sizeof(addr));
    }
    return (0);
  }
--- 183,189 ----
    if (dgramfd != -1) {
      sprintf(pbuf, "A\t%.20s\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.20s",
  	    localnam, password, localnam, uid, (int) tim, name);
!     sendto(dgramfd, pbuf, strlen(pbuf), 0, (struct sockaddr *)&addr, sizeof(addr));
    }
    return (0);
  }
***************
*** 202,208 ****
    if (dgramfd != -1) {
      sprintf(pbuf, "Z\t%.20s\t%.20s\t%.20s\t%.20s",
  	    localnam, password, localnam, uid);
!     sendto(dgramfd, pbuf, strlen(pbuf), 0, &addr, sizeof(addr));
    }
    return (0);
  }
--- 202,208 ----
    if (dgramfd != -1) {
      sprintf(pbuf, "Z\t%.20s\t%.20s\t%.20s\t%.20s",
  	    localnam, password, localnam, uid);
!     sendto(dgramfd, pbuf, strlen(pbuf), 0, (struct sockaddr *)&addr, sizeof(addr));
    }
    return (0);
  }
Index: src/services.c
*** src/services.c.orig Mon, 16 Feb 1998 14:44:40 -0600 dunemush (pennmush/f/31_services.c 1.2 640) 0.23
--- src/services.c      Tue, 24 Mar 1998 09:23:15 -0600 dunemush (pennmush/f/31_services.c 1.2 640) 0.23(w)
***************
*** 490,495 ****
--- 490,496 ----
  
  // if running as a thread, end the thread, otherwise just exit
  
+   fflush(stderr);
    if (threadHandle)
      _endthread();
    else
Index: src/htab.c
*** src/htab.c.orig Mon, 23 Feb 1998 14:31:54 -0600 dunemush (pennmush/f/39_htab.c 1.4 640) 0.23
--- src/htab.c      Tue, 24 Mar 1998 23:06:04 -0600 dunemush (pennmush/f/39_htab.c 1.4 640) 0.23(w)
***************
*** 6,21 ****
  
  #include "config.h"
  #include "copyrite.h"
- #include "externs.h"
- #include "intrface.h"
- #include "htab.h"
- #include "mymalloc.h"
- #include "confmagic.h"
  #ifdef I_STRING
  #include <string.h>
  #else
  #include <strings.h>
  #endif
  
  /* ---------------------------------------------------------------------------
   * hash_val: Compute hash value of a string for a hash table.
--- 6,21 ----
  
  #include "config.h"
  #include "copyrite.h"
  #ifdef I_STRING
  #include <string.h>
  #else
  #include <strings.h>
  #endif
+ #include "externs.h"
+ #include "intrface.h"
+ #include "htab.h"
+ #include "mymalloc.h"
+ #include "confmagic.h"
  
  /* ---------------------------------------------------------------------------
   * hash_val: Compute hash value of a string for a hash table.
Index: game/mushcnf.dst
*** game/mushcnf.dst.orig Wed, 04 Mar 1998 10:11:19 -0600 dunemush (pennmush/g/28_mushcnf.ds 1.3 640) 0.23
--- game/mushcnf.dst      Wed, 08 Apr 1998 13:59:10 -0500 dunemush (pennmush/g/28_mushcnf.ds 1.3 640) 0.23(w)
***************
*** 82,87 ****
--- 82,92 ----
  # objects here. This only is used if globals is set to "yes".
  master_room 2
  
+ # The base room. Any room that can be reached from this room
+ # through exits is considered a 'connected room'.
+ # See also: exits_connect_rooms
+ base_room 0
+ 
  
  ###
  ### Limits, costs, and other constants
Index: game/txt/hlp/penncmd.hlp
*** game/txt/hlp/penncmd.hlp.orig Thu, 19 Feb 1998 13:26:17 -0600 dunemush (pennmush/g/51_penncmd.hl 1.4 640) 0.23
--- game/txt/hlp/penncmd.hlp      Mon, 13 Apr 1998 09:06:14 -0500 dunemush (pennmush/g/51_penncmd.hl 1.4 640) 0.23(w)
***************
*** 2112,2119 ****
    will be listed. If a <class> argument is supplied only objects of a
    certain class will  be listed. Possible <class>es include TYPE, NAME,
    ZONE, PARENT, EXITS, OBJECTS, ROOMS, PLAYERS, FLAGS, POWERS, and EVAL.
!   If <class>=TYPE, possible <restriction>s include OBJECTS, ROOMS,
!   EXITS, PLAYERS.
    
    If <class>=NAME, only objects whose name begin with the string <restriction>
    will be listed. If <class>=ZONE, only objects in the zone <restriction>
--- 2112,2119 ----
    will be listed. If a <class> argument is supplied only objects of a
    certain class will  be listed. Possible <class>es include TYPE, NAME,
    ZONE, PARENT, EXITS, OBJECTS, ROOMS, PLAYERS, FLAGS, POWERS, and EVAL.
!   If <class>=TYPE, possible <restriction>s include OBJECT, ROOM,
!   EXIT, PLAYER.
    
    If <class>=NAME, only objects whose name begin with the string <restriction>
    will be listed. If <class>=ZONE, only objects in the zone <restriction>
***************
*** 2146,2152 ****
    
    Examples:  
      @search flags=Wc      <-- search for connected wizards.
!     @search type=rooms    <-- list all rooms owned by me.
      @search zone=#50      <-- list all objects belong to zone #50.
      @search Joe,100,200   <-- list all objects from #100-#200 owned by Joe.
    
--- 2146,2152 ----
    
    Examples:  
      @search flags=Wc      <-- search for connected wizards.
!     @search type=room     <-- list all rooms owned by me.
      @search zone=#50      <-- list all objects belong to zone #50.
      @search Joe,100,200   <-- list all objects from #100-#200 owned by Joe.
    
Index: game/txt/hlp/pennfunc.hlp
*** game/txt/hlp/pennfunc.hlp.orig Wed, 04 Mar 1998 10:11:19 -0600 dunemush (pennmush/h/1_pennfunc.h 1.3 640) 0.23
--- game/txt/hlp/pennfunc.hlp      Tue, 14 Apr 1998 13:17:43 -0500 dunemush (pennmush/h/1_pennfunc.h 1.3 640) 0.23(w)
***************
*** 1246,1253 ****
    locate(<looker>, <name>, <parameters>)
   
    This function attempts to find the number called <name> relative to
!   <looker>. You must control <looker>. This is a bit like the NUM()
!   function, but with a wider, controllable "range".
   
    You can control the preferred type of the match with:
      E   -   Exits
--- 1246,1254 ----
    locate(<looker>, <name>, <parameters>)
   
    This function attempts to find the number called <name> relative to
!   <looker>. You must control <looker> or have the See_All power. 
!   This is a bit like the NUM() function, but with a wider, controllable 
!   "range".
   
    You can control the preferred type of the match with:
      E   -   Exits
Index: game/txt/hlp/penntop.hlp
*** game/txt/hlp/penntop.hlp.orig Wed, 04 Mar 1998 10:11:19 -0600 dunemush (pennmush/h/4_penntop.hl 1.2 640) 0.23
--- game/txt/hlp/penntop.hlp      Fri, 13 Mar 1998 09:59:12 -0600 dunemush (pennmush/h/4_penntop.hl 1.2 640) 0.23(w)
***************
*** 952,957 ****
--- 952,958 ----
  & POWERS LIST2
    no_pay                Doesn't need money for anything
    no_quota              Has an unlimited quota
+   open_everywhere	Can @open a link from any room.
    pemit_all             Can @pemit to HAVEN/ulocked players.
    poll                  Can use @poll command.
    player_create         Can use @pcreate command.
Index: game/txt/hlp/pennvers.hlp
*** game/txt/hlp/pennvers.hlp.orig Wed, 11 Mar 1998 09:24:40 -0600 dunemush (pennmush/h/5_pennvers.h 1.8 640) 0.23
--- game/txt/hlp/pennvers.hlp      Tue, 14 Apr 1998 14:09:16 -0500 dunemush (pennmush/h/5_pennvers.h 1.8 640) 0.23(w)
***************
*** 30,35 ****
--- 30,64 ----
  1.50p11, 1.50p12, 1.50p13, 1.50p14, 1.50p15, 1.6.0, 1.6.1, 1.6.2,
  1.6.3, 1.6.4, 1.6.5, 1.6.6, 1.6.7, 1.6.8, 1.6.9, 1.6.10, 1.7.0, 1.7.1
  
+ Version 1.7.2 patchlevel 8                    April 2, 1998
+ 
+ Fixes: 
+       * round() could crash on very big numbers on some systems.
+         Reported by Atuarre@ATS.
+       * Problem with exits getting a contents list in certain 
+         conditions fixed. Reported by Atuarre@ATS. [TAP]
+       * Problems with puppets and Pueblo fixed. Report by Mop-Boy.
+       * mkindx problem with dos text files fixed. [NJG]
+       * Order of include files in htab.c was wrong, caused compilation
+         problems on SCO Openserver. Reported by Flame.
+       * On Win32, the MUSH could quit without flushing its buffers. [NJG]
+       * When inside of an object with @listen *, you didn't see things
+         when the object did a 'look'. Reported by Vedui.
+       * Warnings in rwho.c eliminated. [NJG]
+       * More fooling around with mymalloc.h to help the Win32 compile.
+         Suggested by NJG.
+       * open_everywhere power get left off help powers list at some point.
+         Reported by Steven@Champions.
+       * Error message for joining a non-existant channel was different
+         from that for joining a channel that exists but you can't
+         see. Reported by Octavian@M*U*S*H.
+       * get()'ing an attribute that isn't set now returns an error 
+         message only if the default permissions don't allow you to 
+         get it. This allows get(player/ALIAS) to always work, returning
+         an empty string if the player has no ALIAS. [TAP].
+       * base_room mush.cnf option got left out.
+       * dbck didn't check for disconnected rooms correctly. Noted by Rhysem.
+ 
  Version 1.7.2 patchlevel 7                    March 10, 1998
  
  Fixes: