TinyMUSH 3.0 Preview Alpha Release ================================== This preview alpha release of TinyMUSH 3.0 is considered by the developers to be a usable but non-feature-complete version of the TinyMUSH 3.0 server. It is considered stable enough for "production" use, on par with the current released versions of TinyMUX and TinyMUSH 2.2. The codebase at this point is best regard as a fusion of TinyMUX 1.6 and TinyMUSH 2.2.5 features and bugfixes, with some significant additional features, bugfixes, and internal improvements. This is a progress update note, and it focuses on user-visible changes only. It is divided into three sections: things that will be noticeable to users of both TinyMUSH 2.2 and TinyMUX, things that will only be noticeable to users of TinyMUSH 2.2, and things that will only be noticeable to users of TinyMUX. The "base" versions for comparison are TinyMUSH 2.2.5 and TinyMUX 1.6. Virtually all of these features are optional. (Generally, if it's something that has traditionally been "religious" differences over, it is optional.) There is the possibility that some redundant features will be eliminated or turned into softcode before 3.0 release, given that some things have been obsoleted by later improvements to the server. All backwards-compatibility issues are handled automatically through the database conversion process. This list is probably not exhaustive, but is relatively accurate. ----------------------------------------------------------------------------- General Differences =================== - Command-table additions (@addcommand and family) are supported (a cleaned-up version of the MUX implementation). Two 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), and addcommands_obey_stop (defaults to 'no') controls whether or not an object with the Stop flag actually enfores a stop of match attempts when a match is found on an @addcomand for that object. (The defaults are MUX behavior; we suggest that the reverse of the defaults is more desirable, though.) - 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. - There are now ten user-defined flags, MARKER0 through MARKER9. The flag names can be set through the flag_name option, and the permissions for setting them can be set through the flag_access option. - 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. - GNU dbm 1.8.0 is required. Database code has been rewritten to take advantage of its features. Dumps are now automatically optimized, and you may safely back up the MUSH while it is running. - Backup and Restore scripts simplify backup maintenance. - There is now a generic indexed-textfile facility, allowing 'news'-like commands and their associated files to be specified via the 'helpfile' parameter in the conf file. - 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.) - There is now a link_to_anything power, and an open_anywhere power, doing the obvious; these are handy for building-staff players. - 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. - Default channel aliases can now be set with the public_calias and guests_calias config parameters. - 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. - New /pretty switch to examine and @decompile "pretty-prints" (with indentation) attributes. Based on Andrew Molitor's +pex-equivalent code. - New @freelist command moves an object to the head of the freelist, until the next dbck. - New @logrotate command and game_log conf parameter allow the log to be rotated while the game is running. - 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). - 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 %_), 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, and modify() modifies a component of an instance. - 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 doing() function, to get @doing text. - Added force() and trigger() functions. Evil, but useful. - 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 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.) - objmem() does a MUX-style object-structure count; objmem(/) does a 2.2-style attribute-text count. (Fuses the two models.) - streq() does a case-insensitive comparison of two strings, returning 0 or 1. - Added while() function. Evaluates elements of a list, until a termination condition is reached or the end of the list is reached. ----------------------------------------------------------------------------- TinyMUSH Differences ==================== - The TinyMUX powers system has been added. - Added the MUX mailer. (Config option, on by default.) - Added the MUX com system. (Config option, on by default.) - The Guest system has been replaced by the MUX Guest system. - DNS lookups are now done by a slave process (automatically started at startup, or through @startslave); the server will no longer block for them. - Support for identd. - Max login record kept and displayed in WHO. - Added indent_desc config parameter. - Buffer size is now 8000 characters (doubled). - Output block size is now a compile-time parameter. - Auto-restart on crash controlled by signal_action conf parameter. - Attribute caching has been eliminated. - Memory-based databases supported. - Wizards can connect dark via the 'cd' command. - Added '@cpattr' command. - @daily implemented; enabled by 'eventchecking' global parameter, time set by events_daily_hour. - Added @dbclean command, which removes stale attribute names from the database. - Destruction of all objects is delayed until a dbck is done, as was previously true just for rooms. (Exception: DESTROY_OK objects.) - @edit hilites the changed text. - '@function/preserve' preserves registers across user-defined functions. - '@list process' shows the number of descriptors available. - Multi-page and last-paged are now supported. - @search supports a GARBAGE class. - Added 'think' command. - Semaphore @wait can now block on a user-specified attribute. - Added @tofail/@otofail/@atofail (messages for failing to teleport out). - Added the ROYALTY flag. - Added SpeechLock/AUDITORIUM support. - Added FIXED flag (prevents teleporting or going home), with conf parameters fixed_home_message and fixed_tel_message. - The GAGGED flag is back. - Added marker flags: HEAD, STAFF, UNINSPECTED. - TRANSPARENT flag on room shows exits in "long" style. - Added VACATION flag, which auto-resets when a player connects. - hasattr() no longer finds attributes on parents; use the new hasattrp() function for the old hasattr() behavior. - Added alphamax(), alphamin() functions. - Added art() function. - Added beep() function. - Added case() function. - Added children(), lparent() functions. - Added columns() function. - Added encrypt(), decrypt() functions. - Added grep(), grepi() functions. - Added hastype() function. - Added playmem() function. - Added pmatch() function. - Added strcat() function. - Added strtrunc() function. - Note that side-effect functions that fail now generally return #-1 NOT a null string (MUX behavior). If you want to guarantee a null return, wrap the call in a null(). - Currently unimplemented, but in 2.2.5 and on the to-do list: - PARANOID_EMIT - Tcl support ----------------------------------------------------------------------------- TinyMUX Differences =================== - Quotas by object type supported. - Added building_limit conf parameter. - Added player_parent, room_parent, exit_parent, thing_parent conf parameters for default parent objects. - Added log options keyboard_commands and suspect_commands. - Decent password choices are enforced via safer_passwords. - Guest can be locked out from sites via the guest_site parameter. - SIGUSR1 is logged, and the game restarts as GOD, not #1. - Note is written to log after @startup queue is run. - Disconnect log includes command count, bytes input, and bytes output. - New COMMANDS flag, the reverse of the NO_COMMAND flag, which has been eliminated. - New STOP flag, halts matching if a command is matched on a STOP object. (Wizard-only.) - NOSPOOF is only wiz-visible. - The color substitution is now '%x' rather than '%c'. - The '%c' substitution returns the last command. - Added "lag checking". - Added timechecking. - @dump/optimize no longer exists, since the database is optimized after every dump. - @doing truncates the minimum possible (i.e., don't truncate for the ANSI character unless necessary). - Added @dolist/notify. - @enable/@disable now appear in the logfile, like config updates do. - Added @eval command. - examine/brief only shows object ownership (2.2 behavior). - INFO command implemented. - Added '@list cache'. - Hash statistics listing shows stats for @function hash table. - @mvattr no longer clears the original attribute unless it was able to copy it at least once. - @pemit/noeval permits unparsed output. - @pemit/list now obeys the /contents switch. - There is a space after the @program prompt (2.2 behavior). - Added object count to @search. - @stats shows the next dbref to be created. - The #$ @switch/switch() token has been added. - Added @conformat and @exitformat contents and exits formatting. - Command matches can be done unparsed through no_eval attribute flag. - New BOUNCE flag acts like equivalent of @listen of '*' without @ahear. - Added bor(), band(), bnand() functions. - die() checks its arguments 2.2-style (so 0-100 is valid). - Added filterbool() function. - ifelse() now conditions on a boolean, rather than on a non-zero number. - Added nonzero() function, which behaves like ifelse() used to. - lastcreate() and the NewObjs attribute keep track of last-created objects for a given thing. - Added lpos() function. - matchall() returns a null string, not 0, on no match. - mix() can take up to ten arguments total. - objeval() now preserves the cause (enactor) in the evaluation, and allows the calling object to succeed if its owner is the same as the evaluator's owner, instead of needing to _be_ the evaluator's owner (2.2 behavior). - Added programmer() function. - Added remit() function, like pemit() but does contents. - restarts() and restarttime() added. - Added sees() function. - shl(), shr(), inc(), dec() no longer require inputs to be numbers (2.2 behavior). - Added t() function. - Added toss() function. - Vector functions replaced by 2.2 ones, including addition of vdot(). This means that vector multiplication now works, but it breaks the old MUX behavior of vmul(). - Added wipe() function. - Added xcon() function. - elements(), filter(), map(), munge(), setunion(), setinter(), setdiff(), shuffle(), sort(), sortby(), splice() take output delimiters. ----------------------------------------------------------------------------- The preview alpha will be released to the public once automatic database conversion tools exist (presently, we do this manually), there is reasonable documentation, and we're certain that it runs stably outside of our test environment. -- The TinyMUSH 3.0 Developers May 13th, 1999 Updated July 7th, 1999