This is patch08 to PennMUSH 1.7.6. After applying this patch, you will have version 1.7.6p8 To apply this patch, save it to a file in your top-level MUSH directory, and do the following: patch -p1 < 1.7.6-patch08 mv CHANGES CHANGES.176 ./Configure -S make versions make install If 'make versions' fails with an error about Sort::Versions, you can instead download game-txt-hlp-176p08.tar.gz from the ftp site and unpack that from your pennmush/ directory. If you use GNU patch 2.2, you probably want the above to be 'patch -b -p1', not just 'patch -p1'. Unix (or cygwin) users need not worry about failed hunks in src/switchinc.c, hdrs/switches.h, hdrs/cmds.h, or hdrs/funs.h. These files are automatically rebuilt on compile. Then @shutdown and restart your MUSH. - Alan/Javelin In this patch: Minor changes: * The CHANGES file has been renamed so that it always refers to a version number, and utils/mkvershelp.pl now generates seperate .hlp files for each CHANGES file. This will prevent patch hunk failures when two patchlevels of different versions are released and both used to try to modify the same .hlp file. * Channel names are restricted to printable characters, with no leading or trailing spaces. Suggested by Letters@M*U*S*H. * Calling time() with any argument other than 'utc' now generates an error. Report by Time@M*U*S*H. Fixes: * Some redundant code cleanup in look_exits suggested by Vadiv@M*U*S*H. * Help file fixes by Ves@M*U*S*H, Jules@M*U*S*H, Cerekk@bDv. * When page_aliases is on, there's a space between the player's name and alias. Suggested by Saturn@M3. * Command-checking for ZMR contents didn't function when a ZMR was used as a player's personal zone. Reported by BlaZe@M*U*S*H. * Default idle_timeout was different in code and mushcnf.dst. Reported by James Bond@M*U*S*H. [SW] Prereq: 1.7.6p7 *** 1_7_6.118/Patchlevel Sat, 22 Feb 2003 11:08:23 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.1.1.7 600) --- 1_7_6.132(w)/Patchlevel Sat, 22 Mar 2003 10:33:54 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.1.1.8 600) *************** *** 1,2 **** Do not edit this file. It is maintained by the official PennMUSH patches. ! This is PennMUSH 1.7.6p7 --- 1,2 ---- Do not edit this file. It is maintained by the official PennMUSH patches. ! This is PennMUSH 1.7.6p8 *** 1_7_6.118/CHANGES Sat, 22 Feb 2003 11:08:23 -0600 dunemush (pennmush/g/17_CHANGES 1.10.1.6.1.2.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.9.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1 600) --- 1_7_6.132(w)/CHANGES.176 Sat, 22 Mar 2003 10:33:49 -0600 dunemush (pennmush/g/17_CHANGES 1.10.1.6.1.2.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.9.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1 600) *************** *** 18,23 **** --- 18,46 ---- ========================================================================== + Version 1.7.6 patchlevel 8 March 21, 2003 + + Minor changes: + * The CHANGES file has been renamed so that it always refers to + a version number, and utils/mkvershelp.pl now generates seperate + .hlp files for each CHANGES file. This will prevent patch hunk + failures when two patchlevels of different versions are released + and both used to try to modify the same .hlp file. + * Channel names are restricted to printable characters, with no + leading or trailing spaces. Suggested by Letters@M*U*S*H. + * Calling time() with any argument other than 'utc' now generates + an error. Report by Time@M*U*S*H. + Fixes: + * Some redundant code cleanup in look_exits suggested by Vadiv@M*U*S*H. + * Help file fixes by Ves@M*U*S*H, Jules@M*U*S*H, Cerekk@bDv. + * When page_aliases is on, there's a space between the player's + name and alias. Suggested by Saturn@M3. + * Command-checking for ZMR contents didn't function when a ZMR + was used as a player's personal zone. Reported by BlaZe@M*U*S*H. + * Default idle_timeout was different in code and mushcnf.dst. + Reported by James Bond@M*U*S*H. [SW] + + Version 1.7.6 patchlevel 7 February 20, 2003 Fixes: *** 1_7_6.118/game/txt/hlp/pennfunc.hlp Mon, 30 Dec 2002 19:01:02 -0600 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.1.1.1 600) --- 1_7_6.132(w)/game/txt/hlp/pennfunc.hlp Tue, 18 Mar 2003 15:57:11 -0600 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1 600) *************** *** 3454,3465 **** attribute, %# refers to the original enactor and not the 'calling' object; 'me' refers to the object that supplied the attribute. ! However, unlike the u() function, the global registers r(0) through r(9) ! (%q0 - %q9) are preserved in their initial state. This means that functions ! "below" the level of the u() can reset global registers for temporary ! calculations, without needing to worry about "clobbering" the original ! values. ! This makes ulocal() particularly useful for global or shared code which calls arbitrary u() functions, where global register values need to be preserved from accidental user clobbering. --- 3454,3465 ---- attribute, %# refers to the original enactor and not the 'calling' object; 'me' refers to the object that supplied the attribute. ! However, unlike the u() function, the global registers r(0)-r(9) and ! r(A)-r(Z) (%q0-%q9, %qa-%qz) are preserved in their initial state. This ! means that functions "below" the level of the u() can reset global ! registers for temporary calculations, without needing to worry about ! "clobbering" the original values. ! This makes ulocal() particularly useful for global or shared code which calls arbitrary u() functions, where global register values need to be preserved from accidental user clobbering. *** 1_7_6.118/game/txt/hlp/pennflag.hlp Sun, 22 Dec 2002 00:51:08 -0600 dunemush (pennmush/17_pennflag.h 1.1.1.1.1.2.1.1.1.2.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.4.1.2 600) --- 1_7_6.132(w)/game/txt/hlp/pennflag.hlp Sat, 15 Mar 2003 20:25:47 -0600 dunemush (pennmush/17_pennflag.h 1.1.1.1.1.2.1.1.1.2.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.4.1.2.2.1 600) *************** *** 46,58 **** V - Visual W - Wizard X - Safe Z - Shared, Z_Tel ! a - Audible b - Debug c - Connected, Cloudy d - Destroy_Ok e - Enter_Ok g - Gagged h - Halt j - Jury_Ok l - Light m - Myopic n - No_Command o - On-Vacation p - Puppet, Paranoid r - Royalty s - Suspect t - Transparent u - Uninspected v - Verbose ! w - No_Warn x - Terse ? - Unregistered ^ - Listen_Parent ~ - Noaccents --------------------------------------------------------------------- Some flags may not be enabled on some MUSHes. --- 46,58 ---- V - Visual W - Wizard X - Safe Z - Shared, Z_Tel ! a - Audible b - Debug c - Connected d - Destroy_Ok e - Enter_Ok g - Gagged h - Halt j - Jury_Ok l - Light m - Myopic n - No_Command o - On-Vacation p - Puppet, Paranoid r - Royalty s - Suspect t - Transparent u - Uninspected v - Verbose ! w - No_Warn x - Terse, Cloudy ? - Unregistered ^ - Listen_Parent ~ - Noaccents --------------------------------------------------------------------- Some flags may not be enabled on some MUSHes. *** 1_7_6.118/game/txt/hlp/penncmd.hlp Tue, 17 Dec 2002 15:56:03 -0600 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.10.1.1.1.1.1.1 600) --- 1_7_6.132(w)/game/txt/hlp/penncmd.hlp Sun, 23 Feb 2003 16:09:29 -0600 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.10.1.1.1.1.1.1.1.1 600) *************** *** 2448,2454 **** @remit[/switches] = . Sends the message to all contents of , which can be a room, ! thing, or player. (The TinyMUSH equivalent is @pemit/contents). The /silent switch stops the remitter from getting feedback if they're in a different location than the target. --- 2448,2455 ---- @remit[/switches] = . Sends the message to all contents of , which can be a room, ! thing, or player. The message is also sent to the itself. ! (The TinyMUSH equivalent is @pemit/contents). The /silent switch stops the remitter from getting feedback if they're in a different location than the target. *** 1_7_6.118/src/switchinc.c Sat, 22 Feb 2003 11:08:23 -0600 dunemush (pennmush/b/32_switchinc. 1.3.1.2.1.6.1.18.1.2.1.2.2.5.1.4.2.4.1.1.1.2.1.5.1.2.1.5.2.1.1.31.3.4.1.5.1.2 660) --- 1_7_6.132(w)/src/switchinc.c Sat, 22 Mar 2003 10:37:08 -0600 dunemush (pennmush/b/32_switchinc. 1.3.1.2.1.6.1.18.1.2.1.2.2.5.1.4.2.4.1.1.1.2.1.5.1.2.1.5.2.1.1.31.3.4.1.5.1.3 660) *************** *** 132,136 **** {"WIZARD", SWITCH_WIZARD}, {"YES", SWITCH_YES}, {"ZONE", SWITCH_ZONE}, ! {NULL, 0} }; --- 132,136 ---- {"WIZARD", SWITCH_WIZARD}, {"YES", SWITCH_YES}, {"ZONE", SWITCH_ZONE}, ! {NULL, 0} }; *** 1_7_6.118/src/speech.c Sun, 22 Dec 2002 01:40:58 -0600 dunemush (pennmush/b/35_speech.c 1.21.1.2.1.3.1.5.1.1.1.7.1.3.1.1.1.8.1.1.1.1.1.1.1.10.1.2.1.13.2.4.1.1 660) --- 1_7_6.132(w)/src/speech.c Sat, 22 Mar 2003 10:37:07 -0600 dunemush (pennmush/b/35_speech.c 1.21.1.2.1.3.1.5.1.1.1.7.1.3.1.1.1.8.1.1.1.1.1.1.1.10.1.2.1.13.2.4.1.1.3.1 660) *************** *** 828,834 **** /* Figure out the 'name' of the player */ if (PAGE_ALIASES && (a = atr_get_noparent(player, "ALIAS"))) ! current = tprintf("%s(%s)", Name(player), uncompress(a->value)); else current = (char *) Name(player); --- 828,834 ---- /* Figure out the 'name' of the player */ if (PAGE_ALIASES && (a = atr_get_noparent(player, "ALIAS"))) ! current = tprintf("%s (%s)", Name(player), uncompress(a->value)); else current = (char *) Name(player); *** 1_7_6.118/src/look.c Thu, 26 Dec 2002 14:20:42 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.1.1.1 660) --- 1_7_6.132(w)/src/look.c Sat, 22 Mar 2003 10:37:06 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.1.1.1.1.1 660) *************** *** 124,180 **** mush_free((Malloc_t) buff, "string"); return; } ! if (COMMA_EXIT_LIST) { ! if (Dark(loc)) { ! for (thing = Exits(loc); thing != NOTHING; thing = Next(thing)) { ! if (!(DarkLegal(thing)) && Light(thing)) { ! total_count++; ! if (!Transparented(loc) || Opaque(thing)) ! exit_count++; ! } } - } else { - for (thing = Exits(loc); thing != NOTHING; thing = Next(thing)) { - if (!(DarkLegal(thing))) { - total_count++; - if (!Transparented(loc) || Opaque(thing)) - exit_count++; - } - } - } - if (total_count == 0) { - mush_free((Malloc_t) tbuf1, "string"); - mush_free((Malloc_t) tbuf2, "string"); - mush_free((Malloc_t) nbuf, "string"); - return; } - thing = Exits(loc); - } else { ! ! /* Scan the room and see if there are any visible exits */ ! if (Dark(loc)) ! for (thing = Exits(loc); ! (thing != NOTHING) && (DarkLegal(thing) || !Light(thing)); ! thing = Next(thing)) ; ! else ! for (thing = Exits(loc); ! (thing != NOTHING) && DarkLegal(thing); thing = Next(thing)) ; ! if (thing == NOTHING) { ! mush_free((Malloc_t) tbuf1, "string"); ! mush_free((Malloc_t) tbuf2, "string"); ! mush_free((Malloc_t) nbuf, "string"); ! return; } } PUSE; tag_wrap("FONT", "SIZE=+1", exit_name); PEND; notify_by(loc, player, pbuff); ! for (; thing != NOTHING; thing = Next(thing)) { ! if (Name(thing) && !DarkLegal(thing) && (!Dark(loc) || Light(thing))) { strcpy(pbuff, Name(thing)); if ((p = strchr(pbuff, ';'))) *p = '\0'; --- 124,162 ---- mush_free((Malloc_t) buff, "string"); return; } ! /* Scan the room and see if there are any visible exits */ ! if (Dark(loc)) { ! for (thing = Exits(loc); thing != NOTHING; thing = Next(thing)) { ! if (!(DarkLegal(thing)) && Light(thing)) { ! total_count++; ! if (!Transparented(loc) || Opaque(thing)) ! exit_count++; } } } else { ! for (thing = Exits(loc); thing != NOTHING; thing = Next(thing)) { ! if (!(DarkLegal(thing))) { ! total_count++; ! if (!Transparented(loc) || Opaque(thing)) ! exit_count++; ! } } } + if (total_count == 0) { + /* No visible exits. We are outta here */ + mush_free((Malloc_t) tbuf1, "string"); + mush_free((Malloc_t) tbuf2, "string"); + mush_free((Malloc_t) nbuf, "string"); + return; + } PUSE; tag_wrap("FONT", "SIZE=+1", exit_name); PEND; notify_by(loc, player, pbuff); ! for (thing = Exits(loc); thing != NOTHING; thing = Next(thing)) { ! if (!DarkLegal(thing) && (!Dark(loc) || Light(thing))) { strcpy(pbuff, Name(thing)); if ((p = strchr(pbuff, ';'))) *p = '\0'; *** 1_7_6.118/src/game.c Mon, 06 Jan 2003 12:48:49 -0600 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.4.1.1.1.1.1.1.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.5.1.3.1.2.1.2.1.1.1.1 660) --- 1_7_6.132(w)/src/game.c Sat, 22 Mar 2003 10:37:06 -0600 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.4.1.1.1.1.1.1.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.5.1.3.1.2.1.2.1.1.1.1.1.1 660) *************** *** 931,958 **** if (DO_GLOBALS && IsRoom(Zone(Location(player)))) { /* zone of player's location is a zone master room */ ! ! if (Location(player) != Zone(player)) { ! ! /* check zone master room exits */ ! if (remote_exit(player, cptr)) { ! if (!Mobile(player)) ! goto done; ! else { ! do_move(player, cptr, 2); ! goto done; ! } ! } else ! /* check commands in the zone master room if no exits ! * can match more than one $command in zone master room ! */ ! a += list_match(Contents(Zone(Location(player)))); ! } /* end of zone master room check */ } else - /* try matching commands on area zone object if GLOBALS - * aren't in use or zone object isn't a room - */ - if ((!a) && (Zone(Location(player)) != NOTHING)) a += cmd_match(Zone(Location(player))); } /* end of matching on zone of player's location */ --- 931,950 ---- if (DO_GLOBALS && IsRoom(Zone(Location(player)))) { /* zone of player's location is a zone master room */ ! /* check zone master room exits */ ! if (remote_exit(player, cptr)) { ! if (!Mobile(player)) ! goto done; ! else { ! do_move(player, cptr, 2); ! goto done; ! } ! } else ! /* check commands in the zone master room if no exits ! * can match more than one $command in zone master room ! */ ! a += list_match(Contents(Zone(Location(player)))); } else a += cmd_match(Zone(Location(player))); } /* end of matching on zone of player's location */ *************** *** 961,967 **** */ if ((!a) && (Zone(player) != NOTHING) && (Zone(Location(player)) != Zone(player))) { ! a += cmd_match(Zone(player)); } /* end of zone stuff */ if (DO_GLOBALS) { --- 953,965 ---- */ if ((!a) && (Zone(player) != NOTHING) && (Zone(Location(player)) != Zone(player))) { ! if (DO_GLOBALS && IsRoom(Zone(player))) ! /* Player's personal zone is a zone master room, so we ! * also check commands on objects in that room ! */ ! a += list_match(Contents(Zone(player))); ! else ! a += cmd_match(Zone(player)); } /* end of zone stuff */ if (DO_GLOBALS) { *************** *** 989,994 **** --- 987,993 ---- do_log(LT_HUH, player, 0, "%s", unp); } } + /* command has been executed. Free up memory. */ done: *************** *** 1282,1295 **** num, atrname); } } ! ptr = atrname; ! if ((Zone(player) != NOTHING) && (Zone(player) != Zone(Location(player)))) { ! /* check the player's personal zone */ ! if (ScanFind(player, Zone(player))) { ! *ptr = '\0'; ! notify_format(player, T("Matched personal zone: %s [%d:%s]"), ! unparse_object(player, Zone(player)), num, atrname); } } } } --- 1281,1306 ---- num, atrname); } } ! } ! ptr = atrname; ! if ((Zone(player) != NOTHING) && (Zone(player) != Zone(Location(player)))) { ! /* check the player's personal zone */ ! if (IsRoom(Zone(player))) { ! if (Location(player) != Zone(player)) { ! notify(player, T("Matches on personal zone master room:")); ! DOLIST(thing, Contents(Zone(player))) { ! if (ScanFind(player, thing)) { ! *ptr = '\0'; ! notify_format(player, "%s [%d:%s]", ! unparse_object(player, thing), num, atrname); ! ptr = atrname; ! } ! } } + } else if (ScanFind(player, Zone(player))) { + *ptr = '\0'; + notify_format(player, T("Matched personal zone: %s [%d:%s]"), + unparse_object(player, Zone(player)), num, atrname); } } } *************** *** 1326,1332 **** char placestr[10]; int j; char delim = ' '; - if (!command || !*command) { notify(player, T("What do you want to do with the list?")); if (flags & DOL_NOTIFY) --- 1337,1342 ---- *************** *** 1349,1364 **** wnxt[j] = wenv[j]; for (j = 0; j < NUMQ; j++) rnxt[j] = renv[j]; - bp = outbuf; - if (flags & DOL_DELIM) list += 2; - place = 0; - objstring = trim_space_sep(list, delim); - if (objstring && !*objstring) { /* Blank list */ if (flags & DOL_NOTIFY) --- 1359,1369 ---- *************** *** 1370,1383 **** curr = split_token(&objstring, delim); place++; sprintf(placestr, "%d", place); - if (!(flags & DOL_MAP)) { /* @dolist, queue command */ bind_and_queue(player, cause, command, curr, placestr); } else { const char *replace[2]; char *ebuf, *ebufptr; - /* it's @map, add to the output list */ if (bp != outbuf) safe_chr(delim, outbuf, &bp); --- 1375,1386 ---- *************** *** 1391,1397 **** } *bp = '\0'; - if (flags & DOL_MAP) { /* if we're doing a @map, copy the list to an attribute */ (void) atr_add(player, "MAPLIST", outbuf, GOD, NOTHING); --- 1394,1399 ---- *************** *** 1412,1418 **** { char tbuf1[BUFFER_LEN]; char *p; - #if defined(HAS_UPTIME) && !defined(linux) FILE *fp; char c; --- 1414,1419 ---- *************** *** 1428,1484 **** char line[128]; /* Overkill */ char *nl; #endif - sprintf(tbuf1, T(" Up since: %s"), ctime(&first_start_time)); if ((p = strchr(tbuf1, '\n'))) *p = '\0'; notify(player, tbuf1); - sprintf(tbuf1, T(" Last reboot: %s"), ctime(&start_time)); if ((p = strchr(tbuf1, '\n'))) *p = '\0'; notify(player, tbuf1); - sprintf(tbuf1, T("Total reboots: %d"), reboot_count); notify(player, tbuf1); - sprintf(tbuf1, T(" Time now: %s"), ctime(&mudtime)); if ((p = strchr(tbuf1, '\n'))) *p = '\0'; notify(player, tbuf1); - /* calculate times until various events */ notify_format(player, ! T("Time until next database save: %ld minutes %ld seconds."), (options.dump_counter - mudtime) / 60, (options.dump_counter - mudtime) % 60); notify_format(player, ! T(" Time until next dbck check: %ld minutes %ld seconds."), (options.dbck_counter - mudtime) / 60, (options.dbck_counter - mudtime) % 60); notify_format(player, ! T(" Time until next purge: %ld minutes %ld seconds."), (options.purge_counter - mudtime) / 60, (options.purge_counter - mudtime) % 60); #ifdef USE_WARNINGS if (options.warn_interval) notify_format(player, ! T(" Time until next @warnings: %ld minutes %ld seconds."), (options.warn_counter - mudtime) / 60, (options.warn_counter - mudtime) % 60); #endif - /* Mortals, go no further! */ if (!Wizard(player) || mortal) return; #ifdef linux /* Use /proc files instead of calling the external uptime program on linux */ - /* Current time */ { struct tm *t; t = localtime(&mudtime); - strftime(tbuf1, sizeof tbuf1, "%I:%M%p ", t); nl = tbuf1 + strlen(tbuf1); } --- 1429,1481 ---- char line[128]; /* Overkill */ char *nl; #endif sprintf(tbuf1, T(" Up since: %s"), ctime(&first_start_time)); if ((p = strchr(tbuf1, '\n'))) *p = '\0'; notify(player, tbuf1); sprintf(tbuf1, T(" Last reboot: %s"), ctime(&start_time)); if ((p = strchr(tbuf1, '\n'))) *p = '\0'; notify(player, tbuf1); sprintf(tbuf1, T("Total reboots: %d"), reboot_count); notify(player, tbuf1); sprintf(tbuf1, T(" Time now: %s"), ctime(&mudtime)); if ((p = strchr(tbuf1, '\n'))) *p = '\0'; notify(player, tbuf1); /* calculate times until various events */ notify_format(player, ! T ! ("Time until next database save: %ld minutes %ld seconds."), (options.dump_counter - mudtime) / 60, (options.dump_counter - mudtime) % 60); notify_format(player, ! T ! (" Time until next dbck check: %ld minutes %ld seconds."), (options.dbck_counter - mudtime) / 60, (options.dbck_counter - mudtime) % 60); notify_format(player, ! T ! (" Time until next purge: %ld minutes %ld seconds."), (options.purge_counter - mudtime) / 60, (options.purge_counter - mudtime) % 60); #ifdef USE_WARNINGS if (options.warn_interval) notify_format(player, ! T ! (" Time until next @warnings: %ld minutes %ld seconds."), (options.warn_counter - mudtime) / 60, (options.warn_counter - mudtime) % 60); #endif /* Mortals, go no further! */ if (!Wizard(player) || mortal) return; #ifdef linux /* Use /proc files instead of calling the external uptime program on linux */ /* Current time */ { struct tm *t; t = localtime(&mudtime); strftime(tbuf1, sizeof tbuf1, "%I:%M%p ", t); nl = tbuf1 + strlen(tbuf1); } *************** *** 1510,1516 **** if (fgets(line, sizeof line, fp)) { double load[3]; char *x, *l = line; - load[0] = strtod(l, &x); l = x; load[1] = strtod(l, &x); --- 1507,1512 ---- *************** *** 1528,1534 **** *nl = '\0'; notify(player, tbuf1); - #else /* linux */ #ifdef HAS_UPTIME fp = --- 1524,1529 ---- *************** *** 1536,1542 **** (FILE *) #endif popen(UPTIME_PATH, "r"); - /* just in case the system is screwy */ if (fp == NULL) { notify(player, T("Error -- cannot execute uptime.")); --- 1531,1536 ---- *************** *** 1548,1582 **** tbuf1[i] = c; tbuf1[i] = '\0'; pclose(fp); - notify(player, tbuf1); #endif /* HAS_UPTIME */ #endif /* !linux */ - /* do process stats */ - pid = getpid(); psize = getpagesize(); ! notify_format(player, T("\nProcess ID: %10u %10d bytes per page"), pid, psize); - #ifdef linux /* Linux's getrusage() is mostly unimplemented. Just has times, page faults and swapouts. We use /proc/self/status */ - #ifdef HAS_GETRUSAGE getrusage(RUSAGE_SELF, &usage); notify_format(player, T("Time used: %10ld user %10ld sys"), usage.ru_utime.tv_sec, usage.ru_stime.tv_sec); notify_format(player, ! T("Page faults: %10ld hard %10ld soft %10ld swapouts"), usage.ru_majflt, usage.ru_minflt, usage.ru_nswap); #endif - fp = fopen("/proc/self/status", "r"); if (!fp) return; - /* Skip lines we don't care about. */ while (fgets(line, sizeof line, fp) != NULL) { static const char *fields[] = { --- 1542,1571 ---- tbuf1[i] = c; tbuf1[i] = '\0'; pclose(fp); notify(player, tbuf1); #endif /* HAS_UPTIME */ #endif /* !linux */ /* do process stats */ pid = getpid(); psize = getpagesize(); ! notify_format(player, ! T("\nProcess ID: %10u %10d bytes per page"), pid, psize); #ifdef linux /* Linux's getrusage() is mostly unimplemented. Just has times, page faults and swapouts. We use /proc/self/status */ #ifdef HAS_GETRUSAGE getrusage(RUSAGE_SELF, &usage); notify_format(player, T("Time used: %10ld user %10ld sys"), usage.ru_utime.tv_sec, usage.ru_stime.tv_sec); notify_format(player, ! T ! ("Page faults: %10ld hard %10ld soft %10ld swapouts"), usage.ru_majflt, usage.ru_minflt, usage.ru_nswap); #endif fp = fopen("/proc/self/status", "r"); if (!fp) return; /* Skip lines we don't care about. */ while (fgets(line, sizeof line, fp) != NULL) { static const char *fields[] = { *************** *** 1584,1590 **** "SigPnd:", "SigBlk:", "SigIgn:", "SigCgt:", NULL }; int n; - for (n = 0; fields[n]; n++) { Size_t len = strlen(fields[n]); if (strncmp(line, fields[n], len) == 0) { --- 1573,1578 ---- *************** *** 1596,1602 **** } fclose(fp); - #else /* LINUX */ #ifdef HAS_GETRUSAGE getrusage(RUSAGE_SELF, &usage); --- 1584,1589 ---- *************** *** 1608,1628 **** "Integral mem:%10ld shared %10ld private %10ld stack", usage.ru_ixrss, usage.ru_idrss, usage.ru_isrss); notify_format(player, ! T("Page faults: %10ld hard %10ld soft %10ld swapouts"), usage.ru_majflt, usage.ru_minflt, usage.ru_nswap); ! notify_format(player, ! T("Disk I/O: %10ld reads %10ld writes"), usage.ru_inblock, usage.ru_oublock); ! notify_format(player, ! T("Network I/O: %10ld in %10ld out"), usage.ru_msgrcv, ! usage.ru_msgsnd); ! notify_format(player, ! T("Context swi: %10ld vol %10ld forced"), usage.ru_nvcsw, ! usage.ru_nivcsw); notify_format(player, "Signals: %10ld", usage.ru_nsignals); #endif /* HAS_GETRUSAGE */ #endif /* LINUX */ - #ifdef WIN32 Win32stats(player); #endif --- 1595,1612 ---- "Integral mem:%10ld shared %10ld private %10ld stack", usage.ru_ixrss, usage.ru_idrss, usage.ru_isrss); notify_format(player, ! T ! ("Page faults: %10ld hard %10ld soft %10ld swapouts"), usage.ru_majflt, usage.ru_minflt, usage.ru_nswap); ! notify_format(player, T("Disk I/O: %10ld reads %10ld writes"), usage.ru_inblock, usage.ru_oublock); ! notify_format(player, T("Network I/O: %10ld in %10ld out"), ! usage.ru_msgrcv, usage.ru_msgsnd); ! notify_format(player, T("Context swi: %10ld vol %10ld forced"), ! usage.ru_nvcsw, usage.ru_nivcsw); notify_format(player, "Signals: %10ld", usage.ru_nsignals); #endif /* HAS_GETRUSAGE */ #endif /* LINUX */ #ifdef WIN32 Win32stats(player); #endif *************** *** 1756,1762 **** extern PTAB ptab_command; extern PTAB ptab_attrib; extern PTAB ptab_flag; - void do_list_memstats(dbref player) { --- 1740,1745 ---- *************** *** 1769,1800 **** hash_stats(player, &htab_player_list, "Players"); hash_stats(player, &htab_reserved_aliases, "Aliases"); hash_stats(player, &help_files, "HelpFiles"); - notify(player, "Prefix Trees:"); ptab_stats_header(player); ptab_stats(player, &ptab_attrib, "AttrPerms"); ptab_stats(player, &ptab_command, "Commands"); ptab_stats(player, &ptab_flag, "Flags"); - notify(player, "String Trees:"); st_stats_header(player); - st_stats(player, &atr_names, "AttrNames"); st_stats(player, &object_names, "ObjNames"); st_stats(player, &lock_names, "LockNames"); - #if (COMPRESSION_TYPE >= 3) && defined(COMP_STATS) if (Wizard(player)) { long items, used, total_comp, total_uncomp; double percent; compress_stats(&items, &used, &total_uncomp, &total_comp); notify(player, "---------- Internal attribute compression ----------"); - notify_format(player, "%10ld compression table items used, " - "taking %ld bytes.", items, used); notify_format(player, ! "%10ld bytes in text before compression. ", total_uncomp); ! notify_format(player, ! "%10ld bytes in text AFTER compression. ", total_comp); percent = ((float) (total_comp)) / ((float) total_uncomp) * 100.0; notify_format(player, "%10.0f %% text compression ratio (lower is better). ", --- 1752,1780 ---- hash_stats(player, &htab_player_list, "Players"); hash_stats(player, &htab_reserved_aliases, "Aliases"); hash_stats(player, &help_files, "HelpFiles"); notify(player, "Prefix Trees:"); ptab_stats_header(player); ptab_stats(player, &ptab_attrib, "AttrPerms"); ptab_stats(player, &ptab_command, "Commands"); ptab_stats(player, &ptab_flag, "Flags"); notify(player, "String Trees:"); st_stats_header(player); st_stats(player, &atr_names, "AttrNames"); st_stats(player, &object_names, "ObjNames"); st_stats(player, &lock_names, "LockNames"); #if (COMPRESSION_TYPE >= 3) && defined(COMP_STATS) if (Wizard(player)) { long items, used, total_comp, total_uncomp; double percent; compress_stats(&items, &used, &total_uncomp, &total_comp); notify(player, "---------- Internal attribute compression ----------"); notify_format(player, ! "%10ld compression table items used, " ! "taking %ld bytes.", items, used); ! notify_format(player, "%10ld bytes in text before compression. ", ! total_uncomp); ! notify_format(player, "%10ld bytes in text AFTER compression. ", ! total_comp); percent = ((float) (total_comp)) / ((float) total_uncomp) * 100.0; notify_format(player, "%10.0f %% text compression ratio (lower is better). ", *************** *** 1819,1825 **** if (God(player)) list_mem_check(player); #endif - } char * --- 1799,1804 ---- *************** *** 1829,1835 **** { static char result[BUFFER_LEN]; /* STATIC! */ /* Unlink the last the_epoch and create a new one */ - sprintf(result, "%s.#%d#", basename, the_epoch - 1); unlink(result); sprintf(result, "%s.#%d#", basename, the_epoch); --- 1808,1813 ---- *** 1_7_6.118/src/funtime.c Sat, 30 Nov 2002 15:49:22 -0600 dunemush (pennmush/c/12_funtime.c 1.11.1.14 660) --- 1_7_6.132(w)/src/funtime.c Sat, 22 Mar 2003 10:37:06 -0600 dunemush (pennmush/c/12_funtime.c 1.11.1.14.1.1 660) *************** *** 82,89 **** char *s; struct tm *t; ! if ((nargs == 1 && strcasecmp("UTC", args[0]) == 0) || ! strcmp("UTCTIME", called_as) == 0) t = gmtime(&mudtime); else t = localtime(&mudtime); --- 82,95 ---- char *s; struct tm *t; ! if (nargs == 1) { ! if (!strcasecmp("UTC", args[0])) ! t = gmtime(&mudtime); ! else { ! safe_str(T("#-1 INVALID TIME ZONE"), buff, bp); ! return; ! } ! } else if (!strcmp("UTCTIME", called_as)) t = gmtime(&mudtime); else t = localtime(&mudtime); *** 1_7_6.118/src/extchat.c Mon, 20 Jan 2003 16:17:39 -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.4.2.9.1.2.1.2.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.2.1.1.2.1.1.2.1.1.1.1 660) --- 1_7_6.132(w)/src/extchat.c Sat, 22 Mar 2003 10:37:04 -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.4.2.9.1.2.1.2.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.2.1.1.2.1.1.2.1.1.1.1.1.1 660) *************** *** 72,77 **** --- 72,78 ---- static void channel_join_self(dbref player, const char *name); static void channel_leave_self(dbref player, const char *name); static void do_channel_who(dbref player, CHAN *chan); + static int ok_channel_name(const char *n); const char *chan_speak_lock = "ChanSpeakLock"; const char *chan_join_lock = "ChanJoinLock"; *************** *** 1331,1336 **** --- 1332,1341 ---- notify(player, T("The channel needs a shorter name.")); return; } + if (!ok_channel_name(name)) { + notify(player, T("Invalid name for a channel.")); + return; + } if (!Hasprivs(player) && !canstilladd(player)) { notify(player, T("You already own too many channels.")); return; *************** *** 1466,1471 **** --- 1471,1507 ---- } } + static int + ok_channel_name(const char *n) + { + /* is name valid for a channel? */ + const char *p; + char name[BUFFER_LEN]; + + strcpy(name, remove_markup(n, NULL)); + + if (!name || !*name) + return 0; + + /* No leading spaces */ + if (isspace((unsigned char) *name)) + return 0; + + /* only printable characters */ + for (p = name; p && *p; p++) { + if (!isprint((unsigned char) *p)) + return 0; + } + + /* No trailing spaces */ + p--; + if (isspace((unsigned char) *p)) + return 0; + + return 1; + } + + void do_chan_user_flags(player, name, isyn, flag, silent) dbref player; *** 1_7_6.118/src/conf.c Tue, 17 Dec 2002 15:56:03 -0600 dunemush (pennmush/c/31_conf.c 1.41.2.3.1.3.1.2.1.15.1.1.1.1 660) --- 1_7_6.132(w)/src/conf.c Sat, 22 Mar 2003 10:37:04 -0600 dunemush (pennmush/c/31_conf.c 1.41.2.3.1.3.1.2.1.15.1.1.1.1.1.1 660) *************** *** 799,805 **** options.player_start = 0; options.master_room = 2; options.base_room = 0; ! options.idle_timeout = 10801; options.dump_interval = 3601; strcpy(options.dump_message, T("GAME: Dumping database. Game may freeze for a minute")); --- 799,805 ---- options.player_start = 0; options.master_room = 2; options.base_room = 0; ! options.idle_timeout = 0; options.dump_interval = 3601; strcpy(options.dump_message, T("GAME: Dumping database. Game may freeze for a minute")); *** 1_7_6.118/hdrs/version.h Sat, 22 Feb 2003 11:08:23 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.17.1.2.1.6 660) --- 1_7_6.132(w)/hdrs/version.h Sat, 22 Mar 2003 10:37:09 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.17.1.2.1.7 660) *************** *** 1,2 **** ! #define VERSION "PennMUSH version 1.7.6 patchlevel 7 [02/20/2003]" ! #define SHORTVN "PennMUSH 1.7.6p7" --- 1,2 ---- ! #define VERSION "PennMUSH version 1.7.6 patchlevel 8 [03/21/2003]" ! #define SHORTVN "PennMUSH 1.7.6p8" *** 1_7_6.118/Makefile.SH Wed, 30 Oct 2002 14:50:55 -0600 dunemush (pennmush/d/30_Makefile.S 1.14.1.1.1.7 700) --- 1_7_6.132(w)/Makefile.SH Sun, 23 Feb 2003 10:43:13 -0600 dunemush (pennmush/d/30_Makefile.S 1.14.1.1.1.7.1.1 700) *************** *** 121,127 **** versions: CHANGES* -rm -rf CHANGES*~ CHANGES*bak ! utils/mkvershlp.pl game/txt/hlp/pennvers.hlp CHANGES* safety: $(CP) src/*.c /var/pennmush-bak/src --- 121,127 ---- versions: CHANGES* -rm -rf CHANGES*~ CHANGES*bak ! utils/mkvershlp.pl game/txt/hlp CHANGES* safety: $(CP) src/*.c /var/pennmush-bak/src *** 1_7_6.118/MANIFEST Mon, 11 Nov 2002 20:39:30 -0600 dunemush (pennmush/d/34_MANIFEST 1.21.1.2.1.7.1.3 600) --- 1_7_6.132(w)/MANIFEST Sun, 23 Feb 2003 10:59:21 -0600 dunemush (pennmush/d/34_MANIFEST 1.21.1.2.1.7.1.3.1.1 600) *************** *** 1,5 **** Patchlevel ! CHANGES MANIFEST options.h.dist Configure --- 1,5 ---- Patchlevel ! CHANGES.176 MANIFEST options.h.dist Configure *************** *** 190,196 **** game/txt/hlp/pennmail.hlp game/txt/hlp/pennpueb.hlp game/txt/hlp/penntop.hlp ! game/txt/hlp/pennvers.hlp game/txt/nws/index.nws game/txt/nws/pennmush.nws BUGS --- 190,199 ---- game/txt/hlp/pennmail.hlp game/txt/hlp/pennpueb.hlp game/txt/hlp/penntop.hlp ! game/txt/hlp/pennvOLD.hlp ! game/txt/hlp/pennv174.hlp ! game/txt/hlp/pennv175.hlp ! game/txt/hlp/pennv176.hlp game/txt/nws/index.nws game/txt/nws/pennmush.nws BUGS *** 1_7_6.118/utils/mkvershlp.pl Thu, 26 Apr 2001 10:27:46 -0500 dunemush (pennmush/d/41_mkvershlp. 1.4 700) --- 1_7_6.132(w)/utils/mkvershlp.pl Sun, 23 Feb 2003 10:58:00 -0600 dunemush (pennmush/d/41_mkvershlp. 1.5 700) *************** *** 1,26 **** #!/usr/local/bin/perl # ! # Generate game/txt/hlp/pennvers.hlp from the CHANGES file(s). # Should be run by Makefile from top-level directory # ! # Usage: mkvershlp game/txt/hlp/pennvers.hlp CHANGES CHANGES.OLD ... ! # Most recent file should be first, and files should have changes ! # in reverse chronological order. # use strict; use Sort::Versions; use Text::Wrap; ! my $target = shift; my @sources = @ARGV; my $verspat = '^Version (\S+) patchlevel (\S+)'; my %patchlevels; ! open(OUT,">$target") or die "Unable to open $target\n"; ! print OUT "& changes\n"; my $really_started = 0; foreach my $file (@sources) { warn "Can't open $file!\n", next unless open(IN,"<$file"); my $started = 0; while () { if (/$verspat/o) { --- 1,30 ---- #!/usr/local/bin/perl # ! # Generate game/txt/hlp/ files from the CHANGES file(s). # Should be run by Makefile from top-level directory # ! # Usage: mkvershlp game/txt/hlp CHANGES.176 CHANGES.OLD ... ! # ! # Each file CHANGES. generates file pennv.hlp in the ! # specified directory. # use strict; use Sort::Versions; use Text::Wrap; ! my $targetdir = shift; my @sources = @ARGV; my $verspat = '^Version (\S+) patchlevel (\S+)'; my %patchlevels; ! @sources = sort byrevision @sources; ! my $really_started = 0; foreach my $file (@sources) { warn "Can't open $file!\n", next unless open(IN,"<$file"); + my $target = $file; + $target =~ s/.*\.(.*)/pennv$1.hlp/; + open(OUT,">$targetdir/$target") or die "Unable to open $targetdir/$target\n"; my $started = 0; while () { if (/$verspat/o) { *************** *** 30,35 **** --- 34,40 ---- # This is the first one unless ($really_started) { print OUT <<'EOP'; + & changes 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 '. 'help credits' *************** *** 78,80 **** --- 83,92 ---- close OUT; + # A sort subroutine to order CHANGES. in reverse chronological + # order + sub byrevision { + return $b cmp $a if ($a =~ /\d/ and $b =~ /\d/); + return $a cmp $b; + } + *** 1_7_6.118/game/txt/hlp/pennvOLD.hlp Sat, 22 Mar 2003 10:37:13 -0600 dunemush () --- 1_7_6.132(w)/game/txt/hlp/pennvOLD.hlp Sat, 22 Mar 2003 10:34:15 -0600 dunemush (pennmush/g/30_pennvOLD.h 1.1 660) *************** *** 0 **** --- 1,4440 ---- + & 1.7.3p14 + Version 1.7.3 patchlevel 14 January 29, 2001 + + Major Changes: + * Commands and functions can now be aliased to other names + in mush.cnf, so you can provide translated command names + as well as the english one, etc. Suggested at various times + by Krad@M*U*S*H and David@M*U*S*H. New file aliases.cnf + in game/ is created to put these command_alias and function_alias + directives (as well as reserve_alias). [SW] + Minor Changes: + * smalloc and bigram compression options are no longer supported. [SW] + * Internal improvements to @search/lsearch, which are now more + consistent with one another. [SW] + * mush.cnf options that refer to dbrefs now understand # as + well as just . They are also formatted as dbrefs in @config + and config(). [SW] + * Much longer game/names.cnf file contributed by Kyieren@M*U*S*H. + * New internal function notify_format() to replace notify+tprintf + more safely. [SW] + * Tweaks to network activity timeout code. [SW] + * @stat and lstats no longer needs to scan the entire database. [SW] + Commands: + * @switch and @select can now take a /notify switch, like @dolist. + * Players may @chown by dbref, but they must still be carrying + the object if it's a thing. Suggested by Kyieren@M*U*S*H. + * @clone can now clone rooms. Suggested by Kyieren@M*U*S*H. + * @verb's matching of the argument has been relaxed so + non-privileged objects can use it on remote actors, if the normal + permission checks succeed. This makes @verb much more useful for zones + and master room objects. [SW] + Attributes: + * @forwardlist [2.2,SW] + Functions: + * itemize() takes a list "a b c" and produces "a, b, and c" and + similar tricks. Also callable as elist() for Rhost compatibility. + * ilev() returns the current iter nesting level. [Rhost,SW] + Fixes: + * When indexing help files, ones that aren't in the right format + weren't being properly closed. Report by Nammyung@M*U*S*H. [SW] + * We're much more forgiving about help files that start with + blank lines now. + * Help updates by Kyieren@M*U*S*H, [SW] + * Games w/o MAIL_ALIAS couldn't load maildbs that had mail aliases. + Reported by Nymeria. [SW] + * max_pennies had a limit of 10,000 in conf.c, even though it + has always defaulted to 100,000. Reported by Intrevis@M*U*S*H. + * src/filecopy.c didn't include hdrs/log.h. Fixed by Noltar@Korongil. + * MacOS portability fixes. [DW] + * vsnprintf used in place of vsprintf everywhere when available. [SW] + * Cleanup of @atrlock code. [SW] + * '#' without any trailing numbers was treated as #0 when used as a + dbref. [SW] + * Added explicit checking for lower-case letters in good_atr_name(). [SW] + * Trying to set an attribute with a bad name now gives a better + error message. [SW] + * Fix to potential overflow bug in revwords. [SW] + * Fix to potential overflow bug in @grep. [SW] + * Configure checks for snprintf. Systems unfortunate enough not to + have this (Solaris 2.5.1, for example) are stuck with sprintf. + Report by Broncalo@DuneIII. + * CHARGES were decremented whenever an A-attribute would be + executed, *even if the attribute wasn't set on the object*. + Reported by Kyieren@M*U*S*H. + + & 1.7.3p13 + Version 1.7.3 patchlevel 13 January 9, 2001 + + Major Changes: + * Semaphores may use attributes other than SEMAPHORE. These + "named semaphores" make it easier to have multiple semaphores + waiting on the same object. [SW] + * New attribute flag AF_NODUMP prevents attributes from being + dumped to the db. It applies to QUEUE, SEMAPHORE, and attributes + used as named SEMAPHORES. [SW] + Commands: + * @wait/until can be used to put commands on the wait queue until + some absolute time (in secs) is reached. [SW] + * @cpattr/noflagcopy copies attribute data without flags. + Same for @mvattr. Suggested by Noltar@Korongil. + Functions: + * foreach() takes start and end arguments like TM3/MUX2. [3,SW] + * locate() has a new option to force matching the preferred type, + and an undocumented option to eliminate ambiguous matching is now + documented. [SW] + Minor Changes: + * Experimental support for translating 8-bit accented characters to HTML + entities for Pueblo. [SW] + * Objects without a @lock/zone that are used as zones are noticed and + warned about during dbcks. [SW] + * Some people prefer that +channel "foo now cause you to say "foo + on the channel, instead of stripping the initial quote. Now + it's a mush.cnf option (chat_strip_quote). Suggested by Dave Milford. + * isint() now ignores tiny_math, so isint(foo) will always return 0. [SW] + Fixes: + * Hopefully fixed a problem with puppets doing look for non-Pueblo + players with Pueblo support turned on. The line after the look + could appear to come from the puppet even if it didn't. [SW] + * If you disabled a command with a one-character token (like say), + then running the command with the token ("hi!) would fail, but + wouldn't return the right thing for $command matching. Now it + returns the canoncalized raw command (SAY hi!) so you can trap + it in softcode. Reported by Mackenzie@SWGT Mush + * General linting [SW] + * Help fixes by Eratl@M*U*S*H. + * make customize doesn't try to link mkindx any more. And README and + os2/Makefile don't refer to it either. By Bobby Bailey (Chil@M*U*S*H). + * The internal tprintf() function is safer. [SW] + * Crash bug in @edit fixed, and @edit code is cleaned up. [SW] + * max_pennies documented in mush.cnf. Noted by Oriens@Alexandria + * cmdlocal.dst now includes cmds.h. Reported by David@M*U*S*H. + + + & 1.7.3p12 + Version 1.7.3 patchlevel 12 January 4, 2001 + + Locks: + * A new @lock/chzone, set on a ZMO, controls who may @chzone + objects to the ZMO. This can simplify multi-player building + using ZMOs. Suggested by David@M*U*S*H + Commands: + * @wcheck/me checks all of a player's objects for them. + Functions: + * cflags() function gets channel flags. + * ctitle() gets channel title for an object. Suggested by Luke@M*U*S*H. + * strinsert() function does insert() on strings. Suggested by + Reagan@M*U*S*H. [SW] + * channels() on an object you can't examine now shows you channels + that you have in common with it. Suggested by Trispis@M*U*S*H + Minor changes: + * Runaway objects are now logged, along with the command that + pushed them over the edge. Suggested by Trispis@M*U*S*H. + * All instances of fprintf(stderr,...) after logging is started + are now handled through do_rawlog(LT_ERR,...). By David@M*U*S*H. + * @atrchown works more reasonably. [SW] + * @lock/link on an unlinked exit restricts who may link it. + * Everyone (even mortals) sees object names at the top of + their descriptions when they look at them. Suggested by Jeff + Ferrell most recently. + * New reserve_alias mush.cnf directive makes run-time command + alias reservation possible. Suggested by Jeff Ferrell. + * Mortals may use @command to get info about commands. Suggested by + Chili@M*U*S*H. + * Messages logged during help file indexing distinguish indexing + of admin topics. Suggested by mith@M*U*S*H + Fixes: + * Help fixes by [SW], Jeff Ferrell, mith@M*U*S*H, Mirth@AtheneuMUSH. + * Help update to @cpattr based on behavior noted by Noltar@Korongil. + * cwho and @chan/who behave better with hidden (@hide) players. + Reported by Reagan@M*U*S*H. + * MUSHes with no @functions crashed on @list calls due to a + problem with the hashtable code. Reported by Whiskey. [SW] + * A bug in handling of errors under debug in process_expression + was reported by Reagan@M*U*S*H. [SW] + * Rare memory leak in process_expression fixed. [SW] + * Inconsistencies in the handling of destroyed objects/players + and their locations fixed. [SW] + * The QUEUE attribute was not properly cleared on restart + for non-player objects. It was buggy in other ways, too. [SW] + * The AF_SAFE attribute flag couldn't be reset. Reported by + Pegasus@StarQuest. + * @teleporting into garbage could cause crashes. Reported by Howie + * The help_command and ahelp_command directives now look for + whitespace generally, not spaces specifically. + Suggested by Krad@M*U*S*H + * SIGHUP once again re-reads the config file. [SW] + * If an exit @created an object, that object would be inside the exit + until the next dbck. Now it is created in the exit's source room. [SW] + * Turning the lowest possible integer number into a string could + result in garbage output. [SW] + * Solaris needed arpa/nameser.h before resolv.h in mysocket.c + + & 1.7.3p11 + Version 1.7.3 patchlevel 11 December 4, 2000 + + Minor changes: + * Added 'comsys' as help alias for 'chat'. Suggested by David@M*U*S*H + * New win32 project files and MSVC build instructions by Jenny Lind. + Fixes: + * Improved test for non-broken getdate and getnameinfo. + * Loading panic dumps does better on chatdb. By Maverick@M*U*S*H + * You may leave a channel even if you're the wrong type + to get onto it. Suggested by Cheetah@M*U*S*H. + * Typo in the win32 strcasecmp code fixed [NJG] + * stddev's algorithm improved. [TAP] + * If the go command is restricted, other commands produce spurious + errors during the exit-matching phase of command parsing. + Reported by Jamie@M*U*S*H + + & 1.7.3p10 + Version 1.7.3 patchlevel 10 November 20, 2000 + + Major Changes: + * Improved detection of errors saving the game. If any problems + are encountered, the save is aborted, and online admins notified so + they can fix the problem before finding out about it too late. [SW] + Flags: + * The INHERIT flag has been renamed TRUST, which better describes + its function. INHERIT remains as an alias. + Commands: + * @chan now takes /ungag, /unhide, and /unmute as well as the + usual @chan/gag =no. By David@M*U*S*H. + Minor Changes: + * money() called on a no_pay player returns the value of + MAX_PENNIES to ease softcode checks. Suggested by Oriens@Alexandria. + * Removed help and &help entries from the distributed pennmush.nws + because people will generally want to override them anyway + and we shouldn't introduce problems. Suggested by Jeff Heinen. + * safe_str and friends optimize trivial 0 and 1 letter strings. [SW] + * A version of word-based compression that's almost 8-bit clean + is now included. [SW] + * We now use stricmp and friends for strcasecmp and friends on + Win32, rather than roll our own. [SW] + Fixes: + * @mail aliases couldn't be used by players who didn't have + permissions to see the alias members, which is wrong. + Fixed now. Report by Grinna@M*U*S*H. + * lnum(1) and lnum(0,0) were broken. Report by Jeff Ferrell + * Help updates. [SW] + * @set obj/notanattribute=flag now returns a 'No such attribute' error. + Reported by David@M*U*S*H. [SW] + * Help file indexing tries to detect files that aren't in the right + format. [SW] + * function restrictions were checking the wrong object. [SW] + * objmem and playermem counted eval-locks and atr-locks incorrectly. + Reported by Javin@DynamixMUSH. [SW] + * Fixes to win32 NT_TCP stuff. [NJG] + * Rare memory leak in do_page fixed by David@M*U*S*H. + + & 1.7.3p9 + Version 1.7.3 patchlevel 9 November 20, 2000 + + Major Changes: + * Help files and their associated commands are now defined with + the 'help_command' (or 'ahelp_command') directive + in mush.cnf. So you can translate the help to french and + add an "aidez-moi" command if you like. [SW] + * Help file indexes are now kept in memory and built by the + server. The mkindx program is no longer used. [SW] + * Added restrict_function and @function/restrict, like the versions + for commands. [SW] + * User @functions can now override built-in functions, if you + @function/delete the built-in first. You can also @function/restore + the built-in back. [SW] + Attributes: + * @[oa]zenter and @[oa]zleave on ZMOs are triggered when someone + enters or leaves a given zone. Motion between rooms in the same + zone doesn't trigger these. "Zone" is based on the mover's + absolute room (outermost container) so that entering and leaving + an unzoned object in a zoned room doesn't trigger these either. + Suggested by Michael Kurtz. + Commands: + * New /silent switch for @teleport without @[o|a|ox]tport msgs. + Minor Changes: + * Still less allocation involved in outputting text to connections. [SW] + * @scan has better output when multiple attribs match. [SW] + * Added internal absolute_room function for use by fun_room + and move.c and wiz.c, etc. + * MEM_CHECK now uses a sorted linked list and is faster. [SW] + Fixes: + * References to kill_timer removed from win32 sections. [SW] + * conf.c reports error via logging routines, not fprintf. [SW] + * Assorted minor bug and warning fixes. [SW] + * Fix to example in help regedit by Amberyl. + * @wait and other timing functions were broken under win32. + Fixed now. [LdW] + + + & 1.7.3p8 + Version 1.7.3 patchlevel 8 November 12, 2000 + + Major Changes: + * Objects' names are stored in a string tree like attributes, so + we don't have hundreds of copies of 'West ;west;w' and such + taking up memory. Attribute name "hash table" is now a strtree. [SW] + * We no longer use alarm() to know when to run stuff on the queue. [SW] + * @shutdown/reboot is now supported on Windows builds. This is + slightly experimental. By Revian. + Minor Changes: + * %qa-%qz now operate as global registers like %q0-%q9. + Suggested by Trispis@M*U*S*H and probably others. + * Hashtable lookups are faster (collision chains are sorted) [SW] + * @uptime/mortal suppresses the extra process information [SW] + * Wizard @uptime prints better process information on linux. [SW] + * @listen, @filter and @infilter respect the REGEXP and CASE attribute + flags. Suggested by Maestro@M*U*S*H [SW] + * Having many @waits or semaphores is more efficient, because we + sort those queues by time and we stop looking sooner. [SW] + * User-defined lock names must follow the same rules as attribute + names. The name part of attrib and eval locks have to also. [SW] + * @chan/title's confirmation message is nicer. [SW] + * Minor optimizations related to strcpy() and malloc() overhead. [SW] + * safe_format uses vsnprintf if your system has it. By Luke@M*U*S*H. + * replace_string is safer. By Luke@M*U*S*H. + Fixes: + * iter() is smarter about quitting when the function invocation + limit is reached or the buffer is filled. [TAP] + * lnum() has been greatly sped up. [TAP] + * RWHO references removed from game/mushcnf.dst, game/restart, + etc. by mith@M*U*S*H. + * Fix to help filter by Revian. + * COMPRESSION_TYPE 0 didn't compile. Report by David@M*U*S*H. + * Clarification of @lock/teleport in help @elock by Envinyatar@M*U*S*H + * Compiling w/o MAIL_ALIASES didn't declare load_maliases. + Reported by Envinyatar@M*U*S*H + * clone() was stomping %0-%9. Report by Revian. + * @dol with an empty list now does the right thing (nothing) + instead of running the command once. Report by Linda Naughton [SW] + * spname cleanup by mith@M*U*S*H. + * Fixed a bug in @function function-name [SW] + * make update should finally handle CHAT_TOKEN_ALIAS right. + It's also smarter with mush.cnf + * isword() on a null string now returns 0. Suggested by Ashen-Shugar. + * channels(object) returns a better error when object isn't matched. + Suggested by Trispis. + * Fix to help rand() to reflect actual error return value. Reported + by Philip Mak. + * More translated strings noted by Krad. + * Problems with encrypt()'s logic fixed by Ashen-Shugar. [Rhost] + * Other encrypt() sillyness fixed by Brazil. + * Potential crashers around DEBUG and other buffer overruns + have been fixed. Report by Tajan and Rimnar. [SW] + * notify_anything allocates less memory. [SW] + * Fixed mistagged memcheck "restart.descriptor". + * MacOS portability changes. Should build on MacOS X public beta + (Darwin) systems nearly straightaway. [DW] + * Restart script test for already-running MUSH condensed to one + line. Suggested most recently by Cory Albrecht. + * Serious crash bug in page fixed. Reported by Revian. + * Win32 bugs fixed by Luke@M*U*S*H: problems with dumping + compression suffixes, problems with @uptime + * MUSH no longer crashes if a player alias is > 32 chars in length. + It truncates names that are too long instead. By Luke@M*U*S*H. + * We don't check AF_PRIVATE attributes for $/^commands on children. + By Luke@M*U*S*H. + * Under win32, the MUSH would often start ignoring commands from + players after the first 98 per connection. Fixed by Revian. + + & 1.7.3p7 + Version 1.7.3 patchlevel 7 October 12, 2000 + + Functions: + * filterbool(), for TM3 compatibility. Like filter(), + but tests for any true value, not just 1. [3,SW] + * case(), for TM3 compatibility, and caseall(). Like switch() + and switchall(), but does an exact match, not wildcard. [3,SW] + * valid() takes more categories. [SW] + * localize(), for TM3 compatibility. Like a cross between + s() and ulocal(). [3,SW] + Commands: + * @break, for Rhost compatibility. Stops processing the + current action list. [Rhost,SW] + * @enable and @disable can be used on any boolean config option. [SW] + * @function/enable and @function/disable for built-ins + * @function function-name reports some information on the function, + like @command command-name. + Flags: + * New attribute flag 'safe' prevents accidental modification. + Suggested by Stephen Viscido. [TAP] + Minor Changes: + * The daytime config option is no more. Do a few @searches in + its honor. [SW] + * lsearch() permission is controlled by @search, and entrances() + by @entrances, for consistency with other functions that have + a corresponding command. [SW] + * The number of reboots is tracked, and the restarts() function + added, for TM3 compatibility. [3,SW] + * Rearranged some compile flags to suit systems that have + /usr/local/include/ident.h. By Luiz Claudio Duarte. + * More strings marked for translation. By Krad@M*U*S*H + * :, [, ], (, and ) are no longer legal in attribute names + due to ambiguities and security issues. [TAP,SW] + * Ranges in @search, lsearch() and @find can be either #dbrefs or + (for backwards compatibility), integers. Inspired by ElendorMUSH. [SW] + * Broadcast messages in bsd.c replaced with GAME prefix. + Suggested by Krad@M*U*S*H. + Fixes: + * Fixed a bug in filter() where it only looked + at the first character of the evaluated attribute. [SW] + * Some more noise from info_slave was removed. [SW] + * do_pcreate and do_chownall now live in game.h and not + externs.h. Reported by Maestro@M*U*S*H. + * Clean-up of atr_add calls in void context. [TAP] + * IPv6 buglet fixed. Report by Vexon@M*U*S*H. [SW] + * @config/set can no longer be used to set options in the files + and messages categories, as this has icky consequences. [SW] + * Fixed a logic bug in letters_to_privs where not all the letters + were being turned into privs properly. Report by Bolt@M*U*S*H [SW] + * Fix to isint() so that isint(1a) is 0. [SW] + * Added safe_boolean internal function, and fixed a hang bug + in edit() reported by Walker@M*U*S*H. [SW] + * Fixed problems in panic dumps/reads of maildb and chatdb. [SW] + * @edit is a bit more efficient. [SW] + * Assorted lock structures are allocated in big chunks like + attribute structures, to save malloc overhead. [SW] + * User-defined lock names are stored in the attribute name tree. [SW] + * Various help fixes [SW, Javelin] + * LASTLOGOUT time now forces two-digit day for convtime niceness. [SW] + * Very large malias names or member lists could cause buffer + overruns. [SW] + * Buffer overrun fix, fix to str_chr. [TAP] + * tprintfs removed from DEBUG output so DEBUG doesn't mess up + messages in ^-commands anymore. [TAP] + + & 1.7.3p6 + Version 1.7.3 patchlevel 6 September 20, 2000 + + Minor Changes: + * Translation files are now archived separately on the ftp site. + * A variety of options.h settings have been removed. + EXTENDED_ANSI, DUMP_EMPTY_ATTRS, DUMP_LESS_GARBAGE and the *_LOCK + defines are totally gone. [SW] + OLD_NEWLINES, DELETE_ATTRS and VISIBLE_EMPTY_ATTRS have been + moved out of options.h as they're special-purpose. [SW] + * More common function error messages were made into variables + rather than being hardcoded in as string literals. [SW] + * If a player is set HALT, their queued commands will not run. + * Speedup in process_expression. [TAP]. + Functions: + * The regedit(?:all)?i? family of functions, like perl's s///. [SW] + * Case-insenstive versions of regrab() and regraball(). [SW] + * etimefmt(), which is to timestring() as timefmt() is to time(). [SW] + Fixes: + * Error messages that were already variables are now translated. [SW] + * Fixes to various metaconfig rules. [SW] + * Open_Anywhere and Link_Anywhere were sharing the same + bitmask. Fixed. [SW] + * You can escape : in $command patterns that are being regexp- + matched now. [SW] + * Rewrites of the regexp functions so that, say, regrab() and + regraball() point to the same actual code, using called_as to + know when to stop. They also use PCRE's match optimizing + pcre_study() function when appropriate. [SW] + * Buglets in game/restart and game/mushcnf.dst fixed. + Reported by Krad and Nymeria at M*U*S*H. + * page_aliases directive in mush.cnf works now. Report by Nymeria. + * Same for float_precision. Report by Oleo@M*U*S*H. + * mushtype.h now included in compress.c. [DW] + * Less noise in log/netmush.log from failed ident queries. + * More strings marked for translation. + * Fixes to problems with @search reported by Oleo@M*U*S*H. + * Weird evaluation of functions in softcoded commands fixed. [TAP] + * Cleanup of typos here and there by Padraic@M*U*S*H. + + + & 1.7.3p5 + Version 1.7.3 patchlevel 5 September 7, 2000 + + Minor Changes: + * FLOATING_POINT is no longer an option (it's always on). [SW] + * EXTENDED_ANSI defaults to enabled. [SW] + Attributes: + * @receive/@oreceive/@areceive triggered on the recipient + after a get or give, so you've got access to who caused + you to acquire the object and the object's dbref now. + * @give/@ogive/@agive triggered on the giver with object's + dbref in %0. Suggested by Oriens@Alexandria. + Fixes: + * Fixes for systems with broken or incomplete IPv6 support. [SW] + * Uses of index() changed to strchr() for consistency. [SW] + * Much removal of duplicate function prototypes and rearranging + of headers. hdrs/globals.h is now hdrs/case.h. hdrs/intrface.h is + no more, and hdrs/boolexp.h, hdrs/log.h were added. [SW] + * @search supports "quoted player names". + * We no longer report failed connect to ident servers in the log. + + & 1.7.3p4 + Version 1.7.3 patchlevel 4 August 8, 2000 + + Major Changes: + * Internationalization: + * Support for international time formats via LC_TIME locale [SW] + * Support for message translation + * Support for locale-sensitive ordering of strings (LC_COLLATE) [SW] + To take advantage of the new features, you should have your + LANG environment variable set to an appropriate locale + before you 'make install' (which will cause the right message + catalog to be compiled), and you should see the section + in game/restart for setting it there (which will actually cause + the server to use it). + * IPv6 support [SW] + Commands: + * @dolist/delim and @map/delim [SW] + * @stats/tables [SW] + * SESSION command displays session statistics (experimental) [SW] + Functions: + * uldefault(), like udefault but saves registers like ulocal() [SW] + * switchall(), for Tiny compatibility. [SW] + * cemit() with an option to act like @cemit/noisy [SW] + * vmin() and vmax(), for returning the min and max of each pair in two + vectors. [SW] + * utctime(), convutcsecs() for UTC/GMT time instead of server-local. [SW] + * convtime() uses getdate() if present, along with a variety of templates + * that it can accept. [SW] + * timefmt() - like the strftime() C function. [SW] + * pcreate() side effect function suggested by Adamas and Padraic@M*U*S*H + * starttime() now returns the first startup time, and + restarttime() returns the time of the last @shutdown/reboot [SW] + Minor Changes: + * +help is mentioned in help help. Suggested by Trispis@M*U*S*H. + * include directive for config files, with an example moving all + the restrict_command's to another file. [SW] + * make indent runs expand, then indent, because indent doesn't seem to + handle tabs very well. [SW] + * index-files.pl sorts patchlevels correctly. Patch by Jeff + Heinen. + * LASTLOGOUT attribute records logout time, like LAST, but not + visual. Suggested by Oriens@Alexandria, and others. + * Internal cleanup by David@M*U*S*H. New @config category 'messages', + no more OBJECT_ENDOWMENT or OBJECT_DEPOSIT macros, etc. + * Internal functions safe_integer(), safe_number(), and safe_dbref() + to replace safe_str(unparse_FOO(data), buff, bp) calls [SW] + * You can now @trigger an attribute containing a $command or + ^listen and it'll work (skipping the $...: or ^...: parts). + So you can now do this: + &DO_WHO obj=$who *: @pemit %#=[u(who,%0)] + &DO_+WHO obj=$+who *: @tr me/do_who=%0 + (But you can do this much more efficiently with regexp...) + Fixes: + * table() is less CPU-intensive in extreme cases. [SW] + * Hopefully, Configure now determines pagesize on FreeBSD. + Method suggested by Matt Harris. + * CHAT_TOKEN_ALIAS comment clarification by Oleo@M*U*S*H. + * pcre regexp engine updated to version 3.4. + * Typo in @chan/who fixed by Vexon@M*U*S*H. + * @attribute/access won't modify AF_INTERNAL attributes now. + * Additional win32 portability fixes. [NJG] + * con() was buggy in a bad way. Fixed now. + * Configure -d should now work on linux systems that don't have + crypt libraries. Reports by mith and Inek@M*U*S*H. + * Fix to Z_TEL on things. + * Help fix to @lock5 by Datron@SW2. + Languages: + * Swedish and Hungarian translations for most strings are + included in this patchlevel. + + + & 1.7.3p3 + Version 1.7.3 patchlevel 3 July 12, 2000 + + Major Changes: + * Restrictions to the 7-bit ascii charset have largely been removed + except in attribute names, to help international users. [SW] + * If available, we now use setlocale to support international + charsets (and eventually other conventions, though this should + be considered experimental). If you set your LC_CTYPE environment + variable to, say, 'fr_FR', french-accented characters should work. + Wide (multibyte) charsets are not supported. + Minor Changes: + * Internal cleanup of page/whisper code by David@M*U*S*H. + * New mush.cnf directive, page_aliases, for showing alias of + paging player. Supported by code by David@M*U*S*H. + Requested by many. A contrib version by Flame dates to 1996. + * @chat on a non-existant channel returns an error message. [SW] + * Two new CRYPT_SYSTEM options. One checks both SHS and crypt(3) + for passwords, and saves them back using SHS. The other does + the same for plaintext passwords. These should encourage folks + who currently use crypt(3) to make a painless move to SHS. [SW] + Commands: + * @remit can take /silent and /noisy switches now. Suggested by + Philip Mak. + * @lemit and @emit can take /silent switch. [SW] + * @config/set can set configuration parameters at runtime. [SW] + Functions: + * The set algebra functions can be given a sort order for output. [SW] + Fixes: + * CHAT_TOKEN_ALIAS could get defined w/o a character value. + Added a better explanation of CHAT_TOKEN_ALIAS in options.h.dist. + and fixed utils/update.pl to handle commented defines that take + values a bit better. Report by Nymeria@M*U*S*H. + * You can no longer initiate following a disconnected player. + Report by Dave@Galactic. + * CHANGES for 1.7.1 and 1.7.0 were missing. Back now. + * Typo in options.h.dist corrected. Report by Padraic@M*U*S*H. + * Small Configure portability improvements. + * Better handling of cases where the maildb has messages from + dbrefs that are out of range (due to truncating a db to remove + corruption, for example). Suggested by Ashen-Shugar. + * We now check for sitelocked sites before asking info_slave to + do ident lookups. + * Many help clarifications. [SW] + * linux Configure can use nm to find symbols, finally. + * help locate() now includes the z flag. + + + & 1.7.3p2 + Version 1.7.3 patchlevel 2 June 3, 2000 + + Commands: + * New @sitelock options to control access to god, wizards, admin + by site. [SW] + * @force can now take /noeval [SW] + + Functions: + * squish() can take a second argument to squish non-spaces. [SW] + * div(), floordiv(), modulo(), and remainder(), a set of functions + jointly adopted by MUSH and MUX servers for compatibility. [TAP] + * @@() and null() functions suggested by [LdW]. + + Minor Changes: + * @uptime now shows initial restart time, not just time since + last reboot. + * Each player now has a limit to the number of @mail messages + in their inbox (folder 0), configurable in mush.cnf. + Suggested by Edwin@M*U*S*H. + + Fixes: + * More linting and improved indenting [SW] + * PARANOID works right for broadcast messages (like @cemit) now + too. Report by Vexon@M*U*S*H. + * You can no longer follow what you can't see. + * CHAT_TOKEN_ALIAS info appears in options.h now. Report by + Rhysem@M*U*S*H. + * Mac portability changes. [DW] + * Disconnected players don't follow any more. Suggested by Don Burks. + * Various fixes to better resist crashing due to attacks involving + overwhelming connections. + * @mail/stats for all was broken. Fixed now. + * Clearer message after failed @pemit. Suggested by Eratl@M*U*S*H + * Destroyed things stop following/leading. Report by Ashen-Shugar. + * follow didn't properly set up the followers as enactors. + We no longer short-circuit process_command. Report by Moe@Chicago. + + & 1.7.3p1 + Version 1.7.3 patchlevel 1 May 18, 2000 + + Commands: + * @oemit now takes a list of players. Adapted from patch by Philip Mak. + + Minor Changes: + * Reconnecting is less spammy - we don't show motds again + to players already connected. Suggested by Trispis@M*U*S*H. + + Fixes: + * Configure problem that resulted in weird compile failures on + bind/accept in src/bsd.c fixed. + * Further linting. [SW] + * FreeBSD getrlimit problem diagnosed by [SW] is worked around. + * Couldn't compile w/o FLOATING_POINTS defined. Fixed. + * Fixed a few dependencies in the Makefiles to insure that + hdrs/patches.h and hdrs/switches.h are rebuilt properly. + * Indentation cleanup. + * We now recognize egcs as if it were gcc 2, and set ccflags + accordingly. + * Increased size of some hash tables for performance. [SW] + * Help fixes. [SW] + * flags(obj/attrib) behaved badly unless attrib was CAPITALIZED. + Fixed now. Reported by Vexon@M*U*S*H. + + & 1.7.3p0 + Version 1.7.3 patchlevel 0 April 20, 2000 + + Major Changes: + * If you create a 'patches' subdirectory and keep any user-contrib + patches you apply in there, and if the patches are properly + formatted, i.e., they include these lines: + # Patch name: + # Patch version: + your MUSH's @version and INFO output will report them. + In addition to being helpful for you, this will help the + developers when you send us a bug report including your + @version. [TN] + * As @cemit doesn't override @chan/gag and allows + NOSPOOF notification, it basically now operates just like + @pemit/list (you can protect yourself from spoofing, and you can + silence it). Accordingly, the cemit power is no longer + necessary. It's now a runtime option. + * @malias (@mailing lists) by Daniel Peters. + * Attribute names are now stored in a single string tree, + so we don't have thousands of copies of the string + "FINGER_NOTE", etc., taking up memory. [TAP] + * As a consequence of the attribute name tree, the STARTUP flag + is no longer needed, and will be automatically removed from + dbs. + * Attributes are now inserted in alphabetical order, which + speeds lookup. [TAP] + * Panic dumps now dump the maildb and chatdb, appended to the + end of PANIC.db. The MUSH handles breaking them up on restart. + * New link_anywhere power allows @link'ing to any destination. + * Mortals may create VARIABLE exits. At the time the destination + is computed, the exit is check to see if it has permission to + link there (i.e., the exit controls the destination or the + exit is link_anywhere or the destination is link_ok). + To keep old code from breaking, all existing variable exits are + given the link_anywhere power at first db read in this patch. + Suggested by David@M*U*S*H. + * The follow command is implemented! + * Nested iter is now useful. The itext(n) function returns + the value of ## for the nth innermost iteraction, where + 0 is the most inner, and inum(n) does the same for #@. [TN] + * New regexp library, pcre, now allows perl 5.005 compatible + regular expressions! Suggested by [SW]. + * Objects are now limited in the number of attributes that may + be set on them. This prevents a DoS attack. Suggested by + Ashen-Shugar. + * Some more english-style matching (look my 2nd box). [TN] + + Functions: + * config() returns a list of config option names. + config(