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: