This is the changes log for LPMud 3.0-DR.  I strongly suggest that
you read the DONE file, located in the same directory, for changes
to the base verison of LPMud 3.0, as this file is -DR specific.

Fixes in 3.0.26-DR

   Please read the DONE file for changes that are for 3.0.26.
   Fix a major memory leak with the F_ADD instruction. 
   Fixed a small bug, which would make this_verb() return
      and incorrect value.

Fixes in 3.0.28-DR to 3.0.30-DR

   Read the DONE file for new features to 3.0.28 to 3.0.30.
   Fixed, or reprogrammed, the shadow implementation to be much
   more stable.  There was a bug that could potentially crash 
   the game, if you shadowed something with an shadow that defined
   an init().  This has not been fully tested as "safe", so if you
   are weary of crashing your mud, don't use shadows with inits().

   Added portability for a NeXT.  Please read the Makefile for 
   more information on how to configure it to these machines.

   Fixed a memory leak in ed, which now makes 'x' free it's buffer.
    
Fixes in 3.0.31-DR to 3.0.33-DR

   Please read the DONE file for changes from 3.0.31 to 3.0.33.

   Fixed the search command in ed, to start on the next (or previous)
   line.  

   Restricted shadow, such that shadowing objects cannot be moved,
   and an object cannot shadow if it has an environment.  Shadows
   are destructed when the object they are shadowing is destructed,
   so there no potential memory leak here.

   Fixed a bug with shadowing, which caused the player to get no output
   if the player.c object has a catch_tell defined, and they were being
   shadowed.  Also, catch_tell is now called on player.c with all 
   messages but the notify_fail strings.
   
   added deletea(array, index[, endindex]) to delete element
   index, or if endindex is given, the range of elements index 
   thru endindex, from array.

   Fully overloaded - on arrays (-= also works).  If you do
  
      array - anytype

   it removes the first occurance of anytype from array.  If 'anytype'
   is an array, it removes the first occurance of each element of anytype
   from array, and returns the resultant array.  Please note:  the
   elements MUST be identical, in that they must be the same number,
   object, string, or vector.  The expression:

   ({ ({1, 2, 3}) }) - ({ ({1, 2, 3}) })

   although the first element of each outer array (which is the array
   ({1, 2, 3}) ) are arrays of the same size and elements, these are
   NOT the same arrays, and the result of the above subtraction would
   be

   ({ ({1, 2, 3}) })

   (the elements would have to point to the same physical array
    for these to be equal)

Fixes in version 3.0.34-DR

   Please read the DONE file for version 34 changes.

   Fixed an annoying bug that disabled write() during login.  However,
   this "fix" encompassed taking out the calls to catch_tell on player
   objects.  I am working on a more elegant solution.

Fixes to version 3.0.37-DR

   Please read the DONE file for versions 35-37 changes.

   Many bugs related to not running in compatibility mode
   have been fixed.  Soon, when I get the chance to check
   out the new fixes, functions will be able to return
   dual types, instead of only one type (one of those types
   being TYPE_ANY).  This will allow things like:

     int i;
     i = extract(blah, blah);
   
   to be flagged as an error.  This, now, is not an error, I think,
   since the return type of extract() is TYPE_ANY.  (this is only
   an issue with type-checking)
   
   Ed has been made 'snoopable', by outputting lines instead of
   characters at a time.

   reset() has deviated from Lars' reset scheme slightly.  If 
   an object is past due for a reset, and is referenced, then
   it will reset immediately, instead of the next "reset cycle".
   Also, if it's not past due, it will reset next reset, like
   normal.  

Fixes to version 3.0.37-DR and 3.0.39-DR

   Please read the DONE file for changes in version 37 and 39.

   The typing system has been totally recoded, to allow for multiple
   return types from efuns.  This, unfortunately, has made it so that
   I get to rewrite lars' make_efun.y to reflect these changes, and
   as a result, I haven't incorporated that new feature into the source
   distribution.  He basically took my idea with the efuns.i file, and
   made a readable way to generate that file.  I don't know if I will
   add this to the source or not, as I am still debating that.

   Fixed a bug in +=, which would crash the game if yo uadded a
   string to a number (number += string).

   Fixed a bug with error(), which could potentially crash the 
   game.

   Added #define's for the full message, the prompt, and for if
   find_living can return non-idable objects.

   Fixed some potential too-long evals associated with the reset scheme.

Fixes to version 3.0.39-DR and 3.0.41-DR

   Please read the DONE file for changes in version 40 and 41.

   Fixed a potential bug with return 0 from verbs, that could crash the game.

Fixes to version 3.0.41-DR-1.1

   Reluctantly took out the new type checking system until I can get
   the time to look at it to fix a bug.  Please read the DONE file for
   information on the varargs qualifier, as well as how types are checked
   on EVERY argument to an efun, now.  The type checking is identical to
   Lars' 3.0.   I also fixed some problems with return types of efuns.

   This version will compile lars mudlib.n, if you change all the 
   read_file calls to 

   implode(grab_file(filename), "\n")

   You can put the following macro at the top of any file that has read_file:

   #define read_file(x)  implode(grab_file(x), "\n")

   and it will compile fine.  

Fixes to version 3.0.42-DR

   Please read the DONE file for changes to version 42.

   Fixed some portability bugs.  This was mainly just moving header files
   around... There are probably still some problems porting.  This version
   is known, by me, to port to a Sun3, a Sparc, and HPUX.

   Created master.h, which defines mudlib paths pertaining to create_wizard,
   and modified master.c accordingly.

   Added back Lars' output buffering scheme.  Hopefully it'll work this
   time.  

Fixes to version 3.0.43-DR and 3.0.44-DR

   Please read the DONE file for changes to version 43 and 44.

   Remember to move master.c into your object directory.

   Fixed the ls / bug.
   
   Fixed a bug with ed, which made / and ? skip the next line, and
   started it's search two lines from the current one.

   A switch statement has been implemented, which is identical to the
   C switch statement.  However, if you have variables named 'switch',
   'case', or 'default', you'll get syntax errors.  Also, don't 'return' 
   from a switch case.  It'll crash the game. (hopefully this'll be 
   fixed soon).

Fixes to version 3.0.45-DR

   Please read the DONE file for changes to version 45

   Fixed a small bug that could crash the game, if you got a 
   compiler error that is longer than 100 bytes long.

   Fixed a bug with swapping, which wouldn't swap out argument type
   information.

   MAJOR Change to shadow implementation.  shadow(arg, 1) now returns
   arg, instead of the topmost shadow of arg.  Also, set_shadowing_object
   is no longer called,since it is not needed anymore. (set_shadowing_object
   was used to set a shadow's pointer to the object it's shadowing.)

   Added Lars' read_file.  In compatiblity mode, read_file works as expected,
   if called like the "old" way of calling read_file; i.e.

      read_file("blah", 1);

   would read the first line of blah.  However, in non-compatibility mode,
 
      read_file("blah", 1);

   works as Lars' read_file would behave, that is, read from the first line
   of the file to the end of the file.  Also, in EITHER mode, if you do

      read_file("blah");
 
   it will read the entire file in as a string, and return that to you, and
   if you do

      read_file("blah", start, len);

   it will read from start, reading len lines, and return a string of all 
   lines read in.

   Also, grab_file now takes a start and len argument, to be the starting
   line to read, and how many to read.

   This version does NOT have lars' new call_out()/this_player() feature.
   I will add this with the next version, for use with non-compatibility
   mode.

Fixes in version 46-DR to 49-DR

   Fixed a bug with get_attribute, which made it always look at this_object().

   Added Lars' call_out/this_player feature for non compatibility mode.

   Fixed a few potential memory leaks in array.c, which could occur if
   the returned array was 0 length (local buffers weren't being freed).

   Fixed a bug in make_func.y which would cause it to crash.  Also, there
   is still a minor bug, which makes the order you give argument types
   (if an argument can be more than one type) order dependent (this is 
   for func_spec.c).

   combine_free_list has been removed, unless you are using Lars' malloc
   package.  Some people might have old code in their church using this 
   functions...

   I've kept the -DR ls() efun, instead of making it a simulated efun,
   since the simul efun I created to simulate my ls was too slow.
   However, I've put a copy of it in mudlib_simul_efun.c (it probably
   needs a bit of work to get paths right, etc...) if you wish to use
   it.  
   
   shutdown() can only be called from master.c.  I have provided a function
   shut_down_game() in master.c which calls shutdown().  This is to 
   protect anyone from being able to call shutdown() themselves and
   shutting the game down.  (we had this happen accidentally on DR).
   You'll probably want to test previous_object() for whatever object
   you have authorized to call shutdown, inside shut_down_game(), to
   make sure it's being called correctly.

Fixes in version 51

   Added a function to master.c, valid_shout, which will return true if
   the object sent is able to receive a shout.  I did this to further 
   detach the parser from the mudlib (it used to call query_muffled on
   the object, not it gets master.c to do it, to make it more user 
   definable).

   Fixed a bug in the new say(), which could crash the game.

   Moved possessive(), objective(), and subjective() to simul_efun.c.
   Remember to move the new mudlib_simul_efun.c into your obj directory
   if you use these functions... 

Fixes in version 52

   There are none.  Version 52 is version 51 with the say() bug fixed.
   Sort of silly to release a new version if you ask me...

Fixes in version 53

   Fixed a fatal bug with notify_fail, if this_player() == 0.
   Fixed a fatal bug with the new caching functions.

   first_inventory() and next_inventory() now are only defined
   in COMPAT_MODE by default.  Move the definitions of these 
   functions in func_spec.c if this is a problem.

   Fixed a typo in interpret.c, which had FGETUID instead of F_GETUID.

   This is probably the last version I will release that is based off of
   native mode 3.0 distributed in Sweden.  I'm part of the -A project going
   on, and will add features from that version to my -DR version.  Of course
   bug fixes found in either the -A, or native mode, will be incorporated into
   my -DR version; however, I don't like what the CDLIB people did, and are
   doing, and I do like most of what is going on with the -A version.  3.0
   is as stable as any version of lp has ever been, now, so there really isn't
   much more to do, other than add new features, and fix bugs.  I doubt any
   new design decisions will be made, for better or worse.  

Fixes in version 3.1.0 and 3.1.1
 
   remove_action("verb") now removes the verb 'verb' from this_player(),
   if verb was defined by this_object().  This means that you can only 
   remove_action() things that you added yourself (no way to remove actions
   remotely).  This efun returns 1 if it was successful, 0 if the verb wasn't
   found, or wasn't defined by this_object().

   Fixed a bug with previous_object(), which would return incorrect values
   in compat_mode.

   Fixed a bug with get_dir, which would crash the game.

Fixes in version 3.1.2

   Not much new in the LP world.......

   Read the DONE file for changes with 3.1.2.

   Limited the maximum number of call outs any one object can have.
   The constant MAX_CALL_OUTS_ALLOWED in config.h sets the max you
   can have.  This is helpful to stop run-away call_outs.  A value
   of -1 means no limit.

   Added a new efun, strsub, which takes 3 arguments:
      a string,
      an array of the format ({ "str", "rep", "str", "rep", ... });
      and a mode, 
         0 means match anywhere.
         1 means match prefix of word
         2 means match suffix of word
         3 means match exact word.

     This function scans the first argument, and replaces each instance
     of "str" with "rep", according to the rules given by mode.
     Also, each pattern is matched against the NEW string.

     strsub("How now brown cow", ({ "ow", "as"}), 0) would return

       "Has nas brasn cas"

     This efun is useful for text filters, such as DR's jive ring.

   Added back the MudOS mapping structures.  Mappings don't save with
   save_object, yet.  This I'll fix when I have the time.  Look to TMI
   for documentation on mappings.

   Added a new efun, dumpobjs(start, end), which dumps the most recent
   objects, starting at start, ending at end, into a file /OBJDUMP.
   This is a more generic 'dumpallobjs' command.  dumpobjs(0, 1000) would
   dump the last 1000 objects.