Changes from MudOS 0.8.14 to MudOS 0.9.14.

  • added a new data type named 'function'. Be sure to change the names of any variables you may have named 'function'. This data type is a variant on the idea of function pointers. It may be used to store an (object, function) pair in a single variable. The constructor for function variables is as follows:
      function f;
    
      f = (: obj, func :);
    
    where obj and func may be anything allowed by call_other(obj, func). To call the function func in object obj via function variable f, type:
      (*f)(arg0, arg1, ...); 
    
    You may use the new functionp() efun to detect if a variable is of type function.

  • the driver now compiles under the xlc compiler on the RS/6000 (xlc is IBM's fastest of AIX 3.2 C compilers).

  • added Mappings and Interactives fields to the stats output by mud_status().

  • added a new efun set_eval_limit (#define SET_EVAL_LIMIT on options.h) that allows an object to change the max eval cost limit. Be sure to add appropriate mudlib level security before enabling this efun (read the ChangeLog 0.9.13.4).

  • added Cynosure's livings() efun that returns an array of all objects that have called enable_commands() (and haven't yet called disable_commands()).

  • changed the behavior of nullp() and undefinedp() slightly (see 0.9.13.2 ChangeLog).

  • The catch() efun may no longer be used to trap max eval_cost exceeded errors (and thus hang the driver).

  • System V Release 4 support (added M.B. Bundy's patches)

  • added capability to configure the default 'What?' message via the runtime config file.

  • dramatically improved global apply_low (call_other) cache hit rates. Many muds that used to have hit rates near 40% are reporting 93% and above. [This improvement results from fixing a bug we found in the LPmud 3.1.2 cache code. See ChangeLog for more details.]

  • 0.9.14 mappings use about 50% less memory overhead per mapping (compared to 0.9.0).

  • improved performance. MudOS 0.9.14 is much faster than MudOS 0.9.0 at executing many of the more commonly used eoperators.

  • created an efuns.h file that should be #include'd from any file that wants to define new efunctions (see efunctions.c for example).

  • added strcmp() efun (just like C's strcmp) that is convenient for use in the compare functions used by sort_array(). sort_array() has been recoded to use a robust version of qsort so that ill-behaved compare functions won't crash the driver.

  • added efuns clonedp() (detects if an object was created via clone_object), functionp() (detects if a variable is of type 'function').

  • added a new eoperator F_CALL_EXTRA that allows for 512 efuns+eopers instead of the previous limit of 256 (easily extended to allow more). This replaces and enhances the F_CALL_EFUN that we had added to the previous release.

  • Literally hundreds of bug fixes (read the ChangeLog file in the source directory for complete descriptions of these if you're interested)

  • MudOS now runs on more architectures. Here's what we know that it runs on:

  • (internal change) totally rewrote and replaced communication code in the driver (comm.c) to be more efficient.

  • added socket efunctions for inter-object and inter-mud communication (see separate socket efun tutorial and man pages for more a detailed explanation)

  • added MUD mode to the LPC socket efunctions. MUD mode allows LPC data structures such as arrays, mappings, integers, and strings (all except for objects) to be sent atomically via sockets.

  • added DATAGRAM (UDP) mode to the LPC socket efunctions.

  • (internal change) rearchitected interpret.c to use a function lookup table rather than one large switch statement. New efunctions should be added to efunctions.c instead of interpret.c. This enhancement makes it easier to integrate your own efuns into the driver and it allows interpret.c to compile on machines that previously had problems with it.

  • added call to master.c::valid_override(string filename, string function) for each attempt to override a simulated efunction via the efun::func_name() method. 'filename' is the path to the file which is attempting to call efun::func_name(). 'function' is the name of the efun that is to be overridden. If valid_override returns 0, then the current compilation will fail (note: valid_override is only called at compile time and _not_ runtime). valid_override allows valid_destruct, valid_exec, etc. to be dispensed with since the same functionality can be obtained by wrapping the efun in question with a simul_efun of the same name (and including valid_* style checking in the simul_efun). Gist of the idea taken from Amylaar's done file.

  • added the option of configuring the driver so that resets (the calling of reset() in LPC objects) happen in a lazy fashion (by defining LAZY_RESETS in options.h). This option allows resets to happen in an incrementally (rather than all in one pass) and it prevents resets from occuring unless the object to be reset is touched (via an apply_low or move_object) after the usual required reset delay has occurred. The benefits of this option are that performance is smoother (no reset lags) and memory is conserved (since those object which are touched once and never again won't have reset called in them and hence won't reload any objects in reset()).

  • changed various efunctions to honor the hidden object flags so that the set_hide() efunction now offers true driver-supported invisibility of objects.

  • new internal implementation of mappings (associative arrays) which is faster and more robust.

  • new efuns for mappings:

  • split config.h into options.h and port.h. This simplifies the task of configuring the driver to run on a particular machine. In most cases, it will be sufficient to configure options.h (options.h contains configuration options pertaining to preference rather than portability).

  • fixed make_func.y so that it correctly processes func_spec.c on the HP and Sequent.

  • added a NO_ANSI option to options.h that allows escape codes included in user commands to be replaced with spaces.

  • added a MAX_SAVE_SVALUE_DEPTH macro to options.h which solves the problem of calling save_object on an object containing a data structure with a circular (recursive) reference. Admittedly, this isn't a true fix since the object in question (having the circular reference) cannot be saved; however, this is better than allowing the driver to hang. (Yes I know that Amylaar solved this by saving the circular reference in a recoverable fashion. I didn't consider it an important enough problem to spend the time necessary to adopt his solution).

  • added a new efunction replace_string() (see the replace_string man page)

  • added a clonep() efunction that determines if an object was created via the clone_object() efunction.

  • added a localtime() efunction (see the localtime(3) man page)

  • added an uptime() efunction that returns the number of seconds since the driver has been running.

  • removed the mudwho code from the driver (including clilib.c). We have implemented the mudwho protocol (same as that implemented in clilib.c) in LPC using the new MudOS socket efunctions (DATAGRAM mode). See the README in the included mini-mudlib for more details.

  • changed inherit_list() and deep_inherit_list() not to return the filename which is passed to them.

  • added a configuration option that causes this_player() to return 0 inside callbacks made by call_out().

  • heartbeat interval can be now be specified in units of microseconds on those machines with the ualarm() system call.

  • size of the call_other cache table is configurable (via the APPLY_CACHE_BITS define in options.h).* (internal change) totally rewrote and replaced communication code in the driver (comm.c) to be more efficient.

  • made the ed() efunction (internal editor) optional.

  • input_to can now take extra arguments so that you can pass one or more extra arguments to the function input_to calls (notice that this feature makes it possible to avoid using global variables which makes it easier for a single object to be designed to beshared by many players [e.g. daemon-style objects]). For example:
    	void get_name(string name, object new_player)
    	{
    		write("\nWhat is your email address: ");
    		input_to("get_email", 0, new_player, name);
    	}
    	void get_email(string email, object new_player, string name)
    	{
    		new_player->set_email(email);
    		new_player->set_name(name);
    	}
    

  • implemented variable arguments to call_out just like the additions made to input_to described above.

  • You can now compare mappings for equality using the == operator.

  • the message() efun now works. For more info read the accompanying doc on this important new efun!

  • several new required functions to be implemented in the mudlib master.c:

  • several new additions to the runtime configuration file:

  • wizlist() changed to domain_stats(), this is to make statistic taking more consistant with the new domain model versus the wizard model previous to LPmud 3.0. See also: author_stats()

  • valid clone - this isn't enabled by default, but with some changes to options.h, clone_object will fail if an object doesn't have read permission on the file being cloned. (note: this is pretty useless since inheritance doesn't have a similar check)

  • old "parser magic functions" were changed into efuns:

  • some new debugging efuns were added or changed:

  • removed the old hname process and replaced it with a new autonomous (not forked from driver) addr_server program that can be shared by several different drivers at once.

  • removed the cindent() efun

  • removed the describe() efun

  • removed two unused variables from the runtime config system

  • removed everything to do with the "priveleged object" concept

  • removed everything to do with "global verbs", "global preverbs" and "preverbs"

  • all objects now call create when first loaded, even if loaded via inheritance (create called in the original objects, not what's being inherited)

  • crash in master.c is now called with three args (type of crash, command_giver, current_object)

  • if the driver crashes it tries to dump its core file in /cores if that dir exists and core dumping is enabled

  • removed the global define LPCA and replaced it with MUDOS (LPC objects can do #ifdef MUDOS)

  • added AUTO_SETEUID option. if defined, all objects do the equivalent of seteuid(getuid(this_object())); when created.

  • added AUTO_TRUST_BACKBONE define so that you could disable the automatic trusting of backbone uid objects if you want.

  • added Pinkfish's modifications to parse command package so that it actually works now. :-)

  • added an optional integer argument to the shutdown() efun. when an argument is specified, the driver exits with that exit code.

  • removed smalloc from the driver completely (memory alignment violations and other problems made it not worth dealing with).

  • added BSD malloc as an option (seems to work well for those machines having slow system mallocs like the HP).

  • added the concepts of "null" and "undefined" to variables and added two efuns to make use of these concepts

  • there's a DROP_CORE option in options.h which allows you to specify if you want the driver to try to dump core if it has crashed

  • replaced sort_array() with a faster version. Also changed it so that it expects the callback function to return -1, 0, or 1 in a fashion similar to how strcmp() does it.

  • added an option to define the default error message users receive. If it is not defined, then all users get wizard level error messages. This is useful since players are the ones that most often experience these errors and this lets players report them in a more coherent fashion (maybe?).

  • Reworked the domain stuff (added uid.c and uid.h) by separating the concept of uids and euids from that of domains and authors. The wizlist (domain list) code is no longer based on uids but rather on domains. Two new functions are required in master.c: string domain_file(string domain); and string author_file(string author); In addition, valid_author(string author) should be added to master if you wish set_author(string author) to be functional. Note: domain_file and author_file are similar to creator_file (which returns information for uids). domain_file lets the gamedriver know which domain a given object should be in an author_file lets the gamedriver know the author of the file.