
The changes in this file begin with PennMUSH 1.50 patchlevel 4 and go
through patchlevel 7.

   -- Amberyl (lwl@eniac.seas.upenn.edu)

==========================================================================
 
Version 1.50 patchlevel 4  #1,  October 23, 1992

--- Features ---

- New additions -
    * @inprefix and @infilter attributes.
    * Evaluative locks. @lock foo=atr/val does an evaluation on
        the ATR attribute on foo (get_eval style). The lock is passed if
        that equals val.

- Improvements -
    * Added command count; priv'd WHO changed to reflect this.

- Changes to commands -
    * @pemit and @remit to players obey pagelocks.
    * @notify and @drain give player a message.

--- Other changes / bug fixes ---

- Minor changes -
    * lock() always works for royalty.
    * Matching for possessive look and get changed somewhat, so possession
        checks are done _after_ trying to match everything else.
    * lwho() works for everyone (but does not show dark wizards to mortals).
    * Ignore "null" commands from non-players.

- Bug fixes -
    * Changes which made it into 1.50 p3 #2:
        Checking for valid location done near beginning of command checks.
        Properly ifdef'ed a clear_mail() in wiz.c
        Fixed a coredump bug in @search for no arg3 specified.
    * Wizards and royalty can't unset their own flags. Also, royalty
        can only roy-bit objects they own. Previously this latter was
        enforced only via a controls check. This, however, allows royals
        to roy-bit objects by placing them in a controlled zone; this is
        not desirable behavior.
    * @tport and friends work as advertised.
    * @decompile on players no longer incorrectly sets a @parent field.
    * 'look here' inside an object now properly displays idesc.
    * Explicitly prevented non-connected players from being @booted.
    * Fixed an echo 'bug' with puppets: (more of a 2.0 compat thing)
         > @fo Puppet=:foofs.
         Puppet> Puppet foofs.
         Puppet foofs.
    * Fixed direct entering of password in @password.
    * Fixed bug with semaphores caused by not uncompressing semaphore
        attribute before using it. Premature @notifies to prevent future
        blocking should now work.
    * Mail allows "hard" newlines, and now uses standard db-read routines.
    * Mail sanity checks for bad objects with mail.
    * atr_comm_match now correctly blocks checking of $commands from the
        parent. Attributes are entered into the hash table as "checked" even
        if they're just straight text and don't contain a $command.


==========================================================================
 
Version 1.50 patchlevel 5  #1,  November 8, 1992

--- Features ---

- New additions -
    * LOGOUT command. Disconnects you from a character but not the MUSH.
    * @daytime and @login replaced by generic @enable/@disable command.
        These can also be used to control logging. Their values are now
        settable in the config file.
    * ISWORD(). Returns 1 if every character in a string is a letter.
    * NO_COMMAND flag, on an experimental basis. An object set NO_COMMAND
        is not checked for $commands. Pending more profiling data, this
        flag might stay or go.

- Improvements -
    * panic() routine now tells connected players the cause of the panic.

- Changes to commands -
    * @decompile can take a wildcarded attribute pattern.
    * @search and lsearch() have been fixed to be consistent with 2.0.
        Also, parameters to them are no longer case-sensitive. In addition,
        the PARENT class allows you to find all children of an object.
        Royalty now performs these without restriction (i.e. like wizards).
        Mortals can no longer get data on objects they don't own (for
        example, @search flags=Wc no longer works for them.)
        Fixed problems with "type conflicts" that weren't, and generally
        robustified this code.

--- Other changes / bug fixes ---

- Minor changes -
    * The make dependencies in the Makefile have been updated.
    * @config now takes the switches "costs" and "globals". The latter
        lists parameters like "logins", "daytime", and the logging stuff.
        Also, redundant/stupid stuff in the @config listing has been zapped.
    * All "strcpy(buff, "");" statements in eval.c replaced by an infinitely
        more sensible "*buff = '\0';"
    * Default flags set by the conf file are now checked for validity -- i.e.
        you can't make GOING, STARTUP, and CONNECTED, or type flags, defaults.
    * Royalty can see the quotas of other players via @quota.
    * Royalty can always get the zone() of an object.
    * Royalty can @stats other players.
    * Removed the @use-does/@does and gripe commands. Nobody uses the first,
        and there are better ways of communicating (like @mail) than gripe.
    * Got rid of help.c, having the help functions call do_new_spitfile
        directly (that function was moved into bsd.c)
    * Moved all the dead code out of the dist package.
    * Got rid of the nalloc memory allocation package, and all associated code
        It's not been supported for close to a year, and nobody uses it.
    * In hash stuff, malloc calls of the format malloc(sizeof(*ptr))
        (K&R 2nd-edition how-to-write-hash-stuff standard) to the more
        common (and sensible) malloc(sizeof(POINTER_TYPE)) format.

- Bug fixes -
    * Players shouldn't be able to execute commands from Garbage if they
        need a valid location.
    * Documented the ISNUM() function (which existed but wasn't in the docs)
    * Fixed exec() call problem with wrong 'cause' in did_it.
    * Fixed sort() so it doesn't segfault on an empty list. Also, it no
        longer uses calloc()  (and thus no longer leaks memory).
    * Fixed a bug with semaphore execution not copying the stack correctly.
    * Fixed the attribute lock corruption bug. AUGH.
    * Logging function is only called for general commands if log_commands
        is on or the player is SUSPECT.
    * v() permission check is now correctly AF_MDARK not AF_WIZARD.
    * find_flag_on_type (the wrapper for find_flag) now returns -1 on error
        instead of 0, since 0 is the ROOM flag. All calls to these functions
        have been modified.
    * Functions are no longer evaluated unless the parser really needs them.
        This cuts down on some overhead, as well as odd messages for things
        like "help loc()" or even the nonsense "foo loc()"
    * Fixed memory leak in page-return, and got rid of pronoun_substitute()
        function completely (relic of the old parser).

==========================================================================
 
Version 1.50 patchlevel 6  #1,  December 14, 1992

--- Features ---

- New additions -
    * VAL() function. Takes leading numeric prefix from a string.
    * INDEX() function. Like extract(), but works on arbitrary-length
        strings, on an arbitrary separator.
    * WHERE() function. Returns "true" location of an object.
    * Settable attribute flags have been added (@set obj/atr=flag).
        There are three such flags, "no_command", "visual", and
        "no_inherit". The first two are just the old AF_NOPROG and
        !AF_ODARK flags. The last prevents the inheritance of an
        attribute by the children of a parent object.
    * DEBUG flag, on an experimental basis. It is not settable by mortals,
        and it is computationally expensive. It provides precise output
        from the parser.
    * New config directive EX_PUBLIC_ATTRIBUTES added. Examine format for
        objects you don't control is now 2.0-ish. do_examine rewritten.

- Improvements -
    * ITER() now works in a much more usable way. It gets its arguments
        un-eval'ed, and escapes/braces are no longer needed to get it
        to evaluate in a "normal" way. UFUN() also now works with ITER().
    * SWITCH() can now take up to 100 arguments, and its arguments are not
        evaluated until needed.

- Changes to commands -
    * Royalty can set themselves DARK. This vanishes them from the WHO list
        but not from the visible room contents.
    * Royalty can set themselves MONITOR.

--- Other changes / bug fixes ---

- Efficiency -
    * Major improvements in the efficiency of the game have been made. Most
        of them are supported by profiling data (some have not been tested
        under a profiler).
    * string_compare has been replaced by strcasecmp. The built-in library
        function is probably optimal.
    * Got rid of reconstruct_messasge. No more spaces around '=' sign 
        in 'say', '@wizwall', etc, and no more wasted time splicing messages
        together.
    * If we match "me", "here", "#dbref", or "*player", we do no further
        matching.
    * The construction "<name of nearby object> <command>" as an alias for
        @force no longer works. "<#dbref> <command>" still works, but the
        amount of matching caused by the former is insane.
    * Rewrote spname(). If FULL_INVIS isn't defined, it's the same as the
        Name() macro. Otherwise, it returns a const char * and doesn't do
        a strcpy (blech).
    * hash_fn now uses a bitmask instead of modulus. Hash table sizes have
        also been increased.
    * atr_match, atr_get, and atr_add now use all upper-case, eliminating
        the need for string_compare rather than strcmp (and getting rid of
        zillions of tolower() calls). Added upcasestr() function, which
        converts a string to uppercase, in-place. (We convert from lower to
        uppercase MUCH less frequently than vice versa).
    * Small text files are now cached. As long as your small text files
        are small (and they SHOULD be!) the extra memory overhead is not
        at all significant. This eliminates the several grillion calls to
        open() and close() caused by players connecting and disconnecting.
        @readcache command added. (Note that you may have to add a blank
        line to the end of your small text files, since the new code does
        not automatically do so.)

- Misc. changes -
    * Destroying an exit tells you what exit number you destroyed.
    * Mortals can type "ex *player" (since they can type "ex [num(*player)]")
    * Added flags.h (split from db.h).
    * Normal MUSH @shutdown now writes out process statistics.
    * The TERSE flag now suppresses ONLY auto-look messages.
    * Things without real locations (like rooms) can once again @trigger.
    * options.h file has been split from config.h. options.h contains all
        the compilation directives; config.h contains the miscellaneous
        configuration-type things which should not be modified.
    * Commands done in GOING rooms are no longer considered invalid.
    * @parent <object> with no other args unparents an object.
    * REPEAT() with 0 repetitions returns a blank string, not an error.

- Code cleanup -
    * DESC is typedef'ed rather than #define'd in bsd.c.
    * Added new match predicate, match_nearby(). Like an "everything" match,
        but does not check "absolute" refs and *player refs for mortals.
        Cleaned up code to use this where appropriate.
    * Almost all of the set.c functions now do matching in the standard way.
    * In various places, checks for strlen(foo) == 0 have been replaced by
        *foo == '\0'.
    * addrout() is now hostname_convert() (a more sensible name). Also
        rewrote it to use the standard conversion routines.
    * All attribute fetches in eval.c use a consistent form of permission
        checks. (This has the side-effect of no longer allowing objects
        to get a ZFUN from a link_ok zmo). Also, Can_Read_Attr macro is
        now used all over the code.
    * Some minor cleanup in atr_add.
    * fun_lcon, fun_lexits, next_con, and next_exit have been rewritten.
        In addition to being much neater, they now provide more security;
        you cannot use them remotely on a room you don't control, regardless
        of whether or not you own any of the objects in it.
    * The prefix for do_wall is directly assigned instead of being strcpy'ed.
    * In eval.c, and some other files (partially), db[x].foo references 
        have been replaced by the appropriate macros.
    * Added where_is function, returning the true location of an object.
    * can_link and can_link_to are macros.
    * Added Can_Locate macro.
    * In eval.c, fun_foo declarations are static void intstead of void.
    * controls() code now uses a bunch of macros.

- Bug fixes -
    * Eval locks now work properly, since we no longer clobber the 
        uncompress buffer.
    * setunion() duplication bug fixed.
    * edit() recursion bug fixed.
    * Definition of "nearby" corrected to include exits in the same room.
    * You can't "kill" yourself.
    * The lock buffer overflow problem has been fixed the "right" way.
    * esnotify now uses notify_noecho, so puppets don't get emit repeats.
    * Fixed coredump bug caused by exits doing certain funtion calls
        (check was originally for NOTHING rather than GoodObject).
    * Fixed possible buffer overflow problem in set_interp.

- Compatibility -
    * The #ifdefs around the rusage stuff have been changed to HAS_RUSAGE.
        The systems which do and don't have this don't follow any kind of
        consistent pattern.
    * Some minor changes to get the code Linux-compatible. The original
        patches for this were provided by Bob Green (bob@inmos.co.uk).
        The restart script is now written in sh instead of csh.
        FNDELAY changed to O_NDELAY (on Suns, they're the same. Hopefully
        this is true for other systems as well, so things don't break).

==========================================================================
 
Version 1.50 patchlevel 7  #1,  January 17, 1993

--- Features ---

- New additions -
    * Individual powers system. Individual objects and players can be given
        the ability to do specific things, such as "examine anything",
        "teleport anywhere", "boot players", etc.  The BUILDER and IMMORTAL
        flags are now powers, as well.
    * Expanded flag system. Flag lookups are now hashed. A database conversion
        is necessary (see ADD_POWERS directive in options.h, which converts
        a database for both the new flags and the powers system).
    * There is a "no_clone" attribute flag (do not copy attribute when
        the object is @cloned).
    * "@config/functions" lists all functions.
    * New command "@function" allows the addition of user-defined global
        functions which behave just like built-in MUSH functions, but
        can be programmed in MUSH in a UFUN() format.

- New functions -
    * setq() and r() allow local variables (registers, numbered 0-9),
        saved through the execution of a command.
    * squish() removes leading and trailing spaces from a string, and 
        crunches inter-word spaces down to a single space.
    * filter() returns members of a list for which a user-def'ed function
        evaluates to true ("1").
    * fold() recursively evaluates a user-def'ed function and list.
    * rjust() and ljust() pad strings with spaces (or another fill character)
    * nsort() sorts a list of numbers.
    * shuffle() randomizes order of elements in a list.
    * scramble() randomizes order of characters in a string.
  
- Improvements -
    * cat() can take an arbitrary number of arguments.
    * conn() and idlesecs() now recognize #dbref and *player. Added alias
        idle() for idlesecs().
    * The mail database name is now a config option (if you use @mail, you
        MUST change your conf file).

--- Other changes / bug fixes ---

- Misc. changes -
    * "Exits:" line in examine is back.
    * examine on non-existent attribute(s) returns "No matching attributes."
    * NO_COMMAND doesn't block ^, since you have to set the LISTENER flag
        on the object anyway in order to activate ^.
    * @config shows a couple more options.
    * The QUIET flag suppresses "Drained.", "Notified.", "Halted."
    * Logging of database reads at startup is slightly neater.

- Code cleanup -
    * Database loading routines have been changed. Support for "old-style"
        MUSH databases has been removed (who USES old-style MUSH databases??)
        The config directives ADD_PARENTS, ADD_LOCKS, and ADD_ZONES are gone;
        if you need to convert using them, convert using an older PennMUSH
        version, then upgrade that database to the present code.
    * atr_comm_match and list_check stuff in game.c is macro'd and a bit
        easier to read.
    * Got rid of some unnecessary tprintfs with notify_noecho.
    * Prevented buffer overflows with puppet messages.
    * @switch and related stack-pointer-changing functions no longer keep
        copying the stack; added local_wild set of functions.
    * FUNCTION(x) general function declaration macro for eval.c functions.
    * XFUNCTION(x) macro for functions not declared in eval.c
    * cat() and strcat() functions use safe_str and friends.
    * Fixed warnings about assignments being used as truth values.
    * Recoded sort().
    * List-handling functions use list2arr where possible (sort, setfuns).
    * UFUN() code made more generic - addition of parse_attrib() function,
        splits up something of format "<obj>/<attr>" (returning dbref and
        pointer to attrib), do_userfn() executes something of UFUN() format.
    * "channels" field is only in memory if you use chat system.

- Bug fixes -
    * Debug and Verbose output now call raw_notify instead of notify,
        so stack pointer doesn't get clobbered.
    * switch() and iter() arguments are evaluated properly (small change
        made so nesting of these within other functions works sensibly).
    * Players cannot enter arbitrary objects (by dbref) remotely.
