tinymush-3.0b21/game/bin/
tinymush-3.0b21/game/data/
tinymush-3.0b21/src/tools/
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.)