TinyMUSH 3.0 Baseline Release ============================= Beta 1: September 27th, 1999 The bugfixes and general code reworking done in the course of merging TinyMUSH 2.2 and TinyMUX line-by-line, as well as throughout an extensive cleanup, bugfix, and performance-enhancement effort, is too extensive and complex to readily be listed here. Therefore, only user-visible or otherwise highly significant changes are noted here. Note that these are only changes that are completely new to both TinyMUSH 2.2 and TinyMUX; enhancements that were in one server but not the other have been listed in the conversion notes for both servers. - Build script allows "single-step" configuration, build, and installation. - Backup and Restore scripts simplify backup maintenance. - Index script detects help-style files (help, news, etc.) and indexes them. This is now called by Startmush. - Bug reporting is easier, via the ReportCrash script, which analyzes core files and emails the results to the bug reporting address. - GNU dbm 1.8.0 is required. Database code has been rewritten to take advantage of its features. Dumps are now automatically optimized (though you can turn this off using the new conf parameter opt_frequency), and you may safely back up the MUSH while it is running, either internally (through @dump/flatfile) or externally (through the Backup script). - An interface to an external SQL database is now supported, through the SQL() function and supporting administrative commands. Currently, modules for mSQL and MySQL are available. - There is now a generic indexed-textfile facility, allowing 'news'-like commands and their associated files to be specified via the 'helpfile' and 'raw_helpfile' parameters in the conf file. - There are now ten user-defined flags, MARKER0 through MARKER9. The flag names can be set through the flag_name option. Commands, functions, and other things with configurable permissions can also be tied to these flags (for instance, 'function_access lwho marker0'). - The access permissions of flags, including user-defined flags, can be set via the flag_access config directive. In addition to permissions for wizards, wizards/royalty, and god, there is a restrict_player option (only settable by Wizards on players, but settable by mortals on other types of things), and a privileged option (only settable by God on players, but settable by non-robot players on other types of things, if they themselves have the flag). - The access permissions of powers can be set via the power_access config directive. The permission types available are the same as for flags. - Command-table additions (@addcommand and family) are supported (a cleaned-up version of the MUX implementation). Three new conf parameters: - addcommands_match_blindly (defaults to 'yes', controls whether or not a 'Huh?' is produced when a match on an @addcommand'd command doesn't actually match a $command) - addcommands_obey_stop (defaults to 'no') controls whether or not an object with the Stop flag actually enforces a stop of match attempts when a match is found on an @addcomand for that object. - addcommands_obey_uselocks (defaults to 'no') controls whether or not the uselock is checked when an added command is matched. (The defaults are MUX behavior; we suggest that the reverse of the defaults is more desirable, though.) - There are now command "hooks", implemented via the @hook command. Hooks are functions which execute before and/or after a built-in command; using side-effect functions, it is thus possible to customize a command without needing to write a full-blown @addcommand for it, or to execute things before/after every move through an exit. - The term "zone" is now used for two things: MUX-style control-oriented zones, and 2.2-style local-master-rooms. Both types of zones default to on (local_master_rooms and have_zones conf parameters). MUX-style zones now use ControlLock rather than EnterLock, and only objects set CONTROL_OK may be controlled by a ZMO; this provides slightly better security. A new config parameter, 'autozone', controls whether or not objects are automatically zoned to their creator's ZMO at the time of their creation. - The comsystem has been rewritten, resulting in a variety of minor syntax changes and alterations and enhancements to functionality. Default channel aliases can now be set with the public_calias and guests_calias config parameters. - A @cron facility allows tasks to be scheduled at specific times, in much the same way that Unix cron does. - A new flag, BLIND, suppresses has arrived / has left messages. - A new flag, CONSTANT, prevents attributes from being set or altered on an object by anyone other than God. - Variable destination exits are implemented, via the "variable" keyword and the ExitTo attribute; the destination of the exit is determined when it is used. The link_variable power has been added in support of this. (This works in a way similar to PennMUSH's variable destination exits, but ExitTo was used instead of Destination, to reduce likelihood of previous attribute conflicts.) - Command permissions can also be linked to the STAFF and HEAD flags. The "robot" permission has been removed, since nobody was using it. (The "no_robot" permission still exists, though.) - There is now a link_to_anything power, and an open_anywhere power, doing the obvious; these are handy for building-staff players. - The see_hidden power now works. DARK is really two concepts, not showing up in the WHO list and not showing up in the contents list / moving silently. see_hidden allows seeing the former but does not affect the latter. These two concepts are now handled in a consistent manner within the server. - Optional uselock checking for global aconnects has been implemented. (2.2 had this by default; MUX did not have this.) - The disconnect reason is passed for master-room disconnects, too. - When the new conf parameter dark_actions is enabled, objects set Dark still trigger @a-actions when moving, unless the /quiet switch is specified. - When the new conf parameter exit_calls_move is enabled, trying to go through an exit by just typing its name is equivalent to typing 'move <exit name>', allowing this to be intercepted by a move @addcommand. - When the new conf parameter move_match_more is enabled, the move command matches exits like the main command parser does, i.e., it also checks global and zone exits, and in the case of multiple matches, picks a random match. - When the new conf parameter no_ambiguous_match is enabled, ambiguous matches always result in a random selection amongst the matches (i.e., you will never get a "I don't know which one you mean!" message). - The new conf parameter guest_starting_room allows Guest characters to start in a different default room than other characters. - New /info switch to @attribute shows global attribute flags for a single attribute (similar to what '@list user_attributes' produces for all user-defined attributes). - @chown now checks a ChownLock on CHOWN_OK objects. - @chown, @chownall, and @clone now strip flags in a consistent manner, as defined by the conf option stripped_flags. The /nostrip switch negates this stripping. For consistency, @clone/inherit no longer preserves IMMORTAL (but it still preserves INHERIT). - @clone/preserve can be used by anyone, but you must control the original object's owner. - New /instant switch to @destroy causes objects to be instantly destroyed (rather than being queued for destruction at the next purge). Also, a new conf option, instant_recycle, controls whether or not Destroy_OK objects are instantly recycled (rather than being queued for destruction). - New /pretty switch to examine and @decompile "pretty-prints" (with indentation) attributes. Based on Andrew Molitor's +pex-equivalent code. - New /pairs switch to examine matches parentheses, brackets, and braces(), displaying them in ANSI colors. Based on Robby Griffin's ChaoticMUX code. - New @freelist command moves an object to the head of the freelist, until the next dbck. - New /noeval switch to @function defines a user-defined function whose arguments are not pre-evaluated. - New @hashresize command dynamically resizes the hash tables. This is also automatically done at startup time. - The @list options command has been reformatted and reorganized. A new command, @list params, lists additional configuration parameters. - The readability of a configuration parameter can be set via the config_read_access param, and can be listed with @list config_read_perms. A config() function allows players to obtain the value of a configuration parameter that they have permission to read. - The new game_log and divert_log parameters allow the logs for different types of events to be sent to different files. The new @logrotate command allows these logfiles to be rotated while the game is running. Logfiles are also rotated when a @restart is done. Old log are marked with a timestamp in seconds. - New /reply and /replyall switches to @mail allow replying to a mail message, including quoting it via the additional /quote switch. - An object can @program another object if the first object or its owner has the Program power, or the first object controls the second. (This fuses the 2.2 and MUX models.) - @program now reads attributes on the object's parent chain as well, not just the object itself (thus behaving like @trigger and friends). - @ps now shows the attribute being waited upon, for non-Semaphore semaphore waits. - Functions for generic named variables, preserved in a manner similar to the stack (i.e., associated with a specific object, persistent until a restart is done), have been added. setx() sets a named variable, xvars() parses a list of strings into a list of variables, regparse() parses a regular expression into a list of variables, x() accesses a named variable (as does %_<var>), lvars() lists named variables, clearvars() mass-unsets named variables, and let() does a Scheme-style code block (with localized variables). - Functions for generic named data structures (data types), preserved in a manner similar to the stack, in a LISP-like style. structure() defines a structure, unstructure() undefines one, construct() and load() create instances of structures, destruct() removes an instance of a structure, unload() dumps the components of an instance, z() gets the component of an instance, modify() modifies a component of an instance, and lstructures() and linstances() list the names of structures and instances, respectively. - The equivalent of v(ATTRIBUTE) can now be accessed as '%=<ATTRIBUTE>', where the angle-brackets are literal. - Functions that take output delimiters can take null output delimiters (symbolized by the token '@@') and newline ('%r') output delimiters. - Booleans, as represented by functions such as t(), andbool(), and ifelse(), are now handled in a more sensible manner. All dbrefs (#0 and higher) are now considered true; #-1 and below are considered false. The string '#-1 <string>' (such as '#-1 NO MATCH') is considered false. All other strings beginning with '#' are treated like arbitrary strings, so, for instance, lists of dbrefs ('#0 #3 #5') are considered true. The old behavior can be obtained by enabling the booleans_oldstyle config parameter. - The ansi() function compacts multiple ANSI attributes into a single ANSI code. - String-manipulation functions, such as edit() and mid(), no longer strip ANSI characters, and @edit is better able to handle ANSI characters. - An ANSI underline code, %xu, has been added. - Added chomp() function -- akin to perl chomp(), it chomps off a trailing carriage-return newline from a string, if there is one. (Useful for dealing with pipe output.) - Added command() function, which allows the execution of a variety of built-in commands in function form, such as @parent and @name. - Added doing() function, to get @doing text. - Added force(), trigger(), and wait() functions. Evil, but useful. - iter() and list() can now be nested, and the nesting level can be obtained with '#!'. This changes the way parsing is done on both functions, and may affect the manner in which arguments to these functions should be escaped. For backwards compatibility, parse() works like the old iter() (unchanged behavior), and the new loop() function works like list() used to. - The ladd(), lmin(), lmax(), lor(), land(), lorbool() and landbool() functions operate on lists, eliminating the necessity to fold() elements through their non-list counterparts. - Conf parameter lattr_default_oldstyle controls what lattr() returns when it fails to match: if 'yes', this is empty (2.0.10p5 and before, 2.2.1 and later), if 'no', this is #-1 NO MATCH (2.0.10p6, 2.2.0, MUX). Defaults to 'no'. - Added localize() function, keeping changes to r-registers within the "local" scope of that evaluation. - Added lrand() function, generating a delimiter-separated list of N random numbers between X and Y. - The log() function can now taken an optional second argument, the base. - The mix() function can now take an unequal number of elements in each list. (The lists are considered to be padded out with nulls.) - Added ncomp() function for comparing numbers comp() style (very useful for sortby() afficianados). - Added null() function, which just eats output. (Useful for doing things like iter() with side-effect functions, and getting rid of the resulting garbage spaces.) - The nonzero() function outputs the result of an if/else condition on a non-zero result. (This provides MUX-style ifelse() behavior. ifelse() follows the TinyMUSH 2.2 behavior of conditioning on a boolean.) - The objmem(<thing>) function does a MUX-style object-structure count; objmem(<thing>/<wild>) does a 2.2-style attribute-text count. (Fuses the two models.) - The pfind() function returns a dbref, or looks up a player. (This provides MUX-style pmatch() behavior. pmatch() now behaves like the MUX documentation said it should, which is identical to its PennMUSH predecessor.) - step() does the equivalent of map() over multiple elements of a single list, with N elements at a time passed as %0, %1, etc. - streq() does a case-insensitive comparison of two strings, returning 0 or 1. - switchall() returns the string results from all cases that match. - switch() and switchall() can nest the '#$' token, and the nesting level is available with '#!'. - Vector functions no longer have a maximum dimension. - vunit() can take an output delimiter. - Added while() function. Evaluates elements of a list, until a termination condition is reached or the end of the list is reached. - The MUSH manual is included in the distribution in helpfile format. (Thanks to Alierak and sTiLe.)