FB4 Changes

I'm still in the process of hypertexting this document. Until I'm done, here's the flat ASCII version. -- Telzey

2.2fb4.42
Fixed:
  Hopefully have fixed the bug where the input file isn't changed over to
    the latest dumpfile when using DISKBASE.


Added:
  You can now easily change the name of the Currency from Pennies to whatever
    you might want by simply changing the PENNY, PENNIES, CPENNY, and CPENNIES
    #defines in params.h



2.2fb4.41
Fixed:
  BAD bug in db_grow() when not using #define DB_DOUBLING that caused a
    coredump when loading in the db.

  Bug where FORCE primitive would have it's program string overwritten.
    This involved having process_command() copy it's input to a temp buffer.


Changed:
  Changed several routines to use local char buffers instead of strdup()
    to reduce memory fragmentation.  Especially in property accessing.
    I estimate that this cuts the number of calls to malloc() by about
    a third to a half.

  pronoun_substitute() no longer searched down the environment tree for
    %n, %a, %s, %o, %p, or %r properties.  It only looks for those on the
    object that you specified in the call.

  Changed how property checks in boolean expressions are saved to disk.
    This prevents crashing the server on loading when certain characters
    are used in property checking expressions.


Added:
  There is a new #define option, DARK_SLEEPERS, that makes sleeping players
    effectively DARK so that they can't be seen in a normal 'look'.

  There is a new preprocessor command, $def, that is similar to $define,
    except that it only takes the definition to the end of the line, and
    it doesn't use a terminating $enddef.  For example, the line:
      $def TRUE 1
    would be the same as the line:
      $define TRUE 1 $enddef

  A wizard (quelled or unquelled) may preceed a command with a '!' to tell
    the server to run the built in version of the command, instead of trig-
    gering an action with that command's name.  For example, if someone were
    to somehow set up bogus command trap exits for several of the builtins
    like @unlink, @shutdown, @set, @recycle, @action, etc., then a wizard
    could still use one of those commands, with a line like the following:
      !@recycle #1234            or
      !examine #1234
    The '!' can be redefined to being any other character by changing the
    OVERIDE_TOKEN #define in params.h



2.2fb4.4
Changed:
  The NEWEXIT primitive will no longer let Mucker Level 3 players put new
    exits on objects that they do not own.  You now need a wizbit to do that.

  The NEWEXIT primitive now require Mucker Level 3 or better to work.  This
    closes a security loophole that could let a muf virus be written.

  Permissions have been changed a bit.  An @desc program will run HARDUID.
    That is, with the UID permissions of the owner of the object that the
    @desc is on.  Programs in @succs, @fails, @drops, @locks, or propqueues
    like _arrive and _connect, are similarly run HARDUID.  This modification
    was made to close a security loophole that allowed nasty muf viruses
    to be written.  These modifications to MUF permissions might make it
    neccesary to fix the permissions or mucker levels of a few programs on
    existing systems.


Added:
  @version command to list the current server version.


Primitives:
  CHECKARGS (??? s -- ) Takes a string argument that contains an expression
                        that is used to test the arguments on the stack below
                        the given string.  If they do not match what the
                        expression says should be there, then it aborts the
                        running program with an appropriate Program Error
                        Message.  The expression is formed from single
                        character argument tests that refer to different
                        argument types.  See 'man checkargs' for more info
                        on forming the expression strings.



2.2fb4.3
Fixed:
  A problem where @dump didn't dump the database in fb4.3alpha4.
  A bunch of different minor memory leaks.
  Minor bugs with do_open() and do_create() where it registered objects that
   weren't created due to lack of pennies.
  Minor bug with do_dig where it looked for an ABODE parent.
  Bug with @dumping to a new filename where it didn't allocate space for the
   new filename string.


Changed:
  Changed it so the compiler recognized user defined words before primitives.
   This means that new primitives will not cause havok with old programs that
   happen to use functiones named the same as the primitives.

  Changed the DBdump to dump out the database in reverse order.  Named the
   new dbdump format the Foxen2 database dump format.  The reverse dump makes
   db_grow() allocate the memory for db[] in one shot on loading.

  When a MUF error occurrs, it gives the name of the owner of the program
   triggered by the user, instead of the owner of the program running.  This
   means that if someone calls a library routine from their program, and they
   pass it bad arguments, if the routine crashes, then the error message will
   say to contact the owner of the program, not the owner of the library.

  Database dumps are now driven similarly to timequeue events, instead of
   being run by the alarm() handling stuff.  This seems a bit more elegant.

  There is now a 2 minute warning before database dumps.  This time period
   is defined with DUMP_WARNTIME.

  The long abort_compile() macros in compile.c have been replaced by short
   macros that reference a function that does all the dirtywork.



2.2fb4.2
Fixed:
  Bug with dumps occurring while queued programs are running.
  Bugs with killing QUEUEd timequeue processes.
  Crashing bug with loading a db with AUTOSTART programs.
  Myriad bugs with shared strings, CHECKOP(), abort_interp(), CLEAR(), &c.
  Bug with failed recompiled programs having garbage program in memory.
  Bug with pronoun_substitute and %X properties.
  Buffer overflow potential crash bug in pronoun_sub.
  Crashing bug with @booting oneself.
  Hanging bug with @toading players who are still online.
  Various other BUFSIZ problems.
  Bug with program string corruption stemming from re-entrancy bug in interp.
  Various other bugs.


Added:
  @find, @owned, and @entrances now accept the U flag in their flag string
   field.  Uf you specify U, it will match Unlinked objects.  !U means objects
   that are linked.  Players and Things are always linked, while Garbage and
   Programs are never linked.  Rooms are linked if they have a dropto.  Exits
   act as you would expect.  Example:  '@find =EU' finds all your unlinked
   exits.

  @find, @owned, and @entrances also now accept a third argument.  Thi arg
   is a work that specifies what type of output you want.  The default is
   to just show the name and dbref of the matched object.  If you specify
   'owners' (or an abbreviation of that), then it will also show the name
   of the owner for each object, beside the object name.  If you specify
   'links' (also abbreviateable), then it will show either *UNLINKED*, the
   name of the destination for single link exits, or *METALINK* for exits
   with more than one destination.  The last option is 'locations', which
   will have it display the name of the location of each matched item.
   Examples:
     '@find button=T=locations' lists all things named 'button' with locations.
     '@entrances here=E=owners' lists all exits linked to here, with owners.
     '@owned Revar=R=links' lists all the rooms owned by Revar, with dropto's.


Changed:
  The 'info' command now accepts an optional second argument specifying what
   lines of the file to list, similar to the @list command.  For example,
   'info changesfb4= 10-20' would list lines 10 through 20 of the changesfb4
   file.  '-10' is the same as '1-10' and '10-' lists line 10 through to the
   end of the file.  '-' lists the entire file.  If no second arg is given to
   the info command, it lists the entire file.

  Programs refered to by props in _depart/_arrive/_connect/_disconnect propdirs
   will now be all queued up, eliminating the need for a dispatcher program.
   An example would be _connect/announce:1234  That would queue up program
   #1234 when a player connects.  The name ("announce") is not important, and
   can be anything you want, but they are executed in alphabetic order.

  Players can now use '@stats <player>' on themselves to see how many objects
   they own.

  Programs set BUILDER (BLOCKED) run in preempt mode, regardless of the mode
   of the program.  ie: a foreground program, while running in a program set
   BLOCKED, will run pre-empt, with the multitasking effectively shut off.

  Programs set HARDUID and SETUID, that are owned by a Wizard, run at the same
   mucker level as the calling program.  This is useful for writing libraries.

  Now the server will clear properties from memory based on how old they are,
   when you are using DISKBASED, and when too many objects (that haven't been
   changed) have been loaded into memory.

  Tabs sent to the server are now interpreted as single spaces to help solve
   a problem with tabbed comments in MUF programs being uploaded.

  The server now sends a message to the players at the successful completion
   of a dump.

  A #define'able max # of unchanged objects will be allowed into memory
   before an automatic memory purge is performed now.

  When USE_NOFORK and DISKBASE are both defined, then changed objects in
   memory will be purged out to disk at a dump.


Primitives:
  ABORT    (s -- )  Halts the interpreter with an error of the string given.

  DESCRCON (i -- i)  Takes a descriptor and returns the associated connection
                      number, or 0 if no match was found.

  DESCRIPTORS (d -- ix...i1 i) Takes a player dbref, or #-1, and returns the
                                range of descriptor numbers associated with
                                that dbref (or all for #-1) with their count
                                on top.

  ISPID?  (i -- i)  Takes a process id and checks to see if an event with that
                     pid is in the timequeue.  It returns 1 if it is, and 0 if
                     it is not.  NOTE: since the program that is running is not
                     on the timequeue WHILE it is executing, but only when it
                     is swapped out letting other programs run, 'pid ispid?'
                     will always return 0.



2.2fb4.1
Fixed:
  The bug with the FORK primitive not working.
  A bug where a dumping process wouldn't free props loaded in for the dump.

Changed:
  Background programs can be PREEMPTed now, but they can never use a READ or
   be switched into the foreground.

  Programs run from _connect and _disconnect now have the proper values for
   the trigger @ and loc @ variables, instead of #-1.  _connect and _disconnect
   properties can also now refer to registered programs.  ie: $connect-announce

Added:
  There is an available #define MORTAL_DARKING that sets it up to let
   non-wizards set objects and exits they own to be DARK.

  There are now _arrive and _depart program triggering properties set up
   so that when you leave a room, it QUEUEs up the programs referred to
   by the _depart properties in all the rooms down the environment from
   the room left, and when you enter a room, it QUEUEs up all the programs
   referred to by all the _arrive properties down the environment from the
   room entered.  These properties can refer to either dbrefs of programs,
   or registered objects, similarly to _connect and _disconnect.  The
   loc @ for a _depart run program is the dbref of the room left, and will
   not match the value of 'me @ location' which will be the room they went
   to.

Primitives:
  PID  ( -- i)  Returns the timequeue process ID of the running program.



2.2fb4.0

Fixed:

  Memory leak with trying to run programs when timequeue table is full.

  Crashing bug with _listen being set to large or negative numbers.

  Bug with @find listing ALL objects regardless of player's control of them.


Changed:

  The interpreter has been split from the old huge case statement into a set
    of functions pointed to by an array of function pointers.  This makes for
    a slight increase in speed, and also for easier addition of primitives.

  You can now connect to a player via dbref.  Just give the dbref where you
    would normally put your name in the connection request.  For example:
          connect #1234 craZypassWord

  @boot now @boots the oldest connection of a player instead of the youngest.

  Added the #define SECURE_TELEPORT in config.h for making exits on a player
    require either that the player own the room they are in, or else the room
    must be JUMP_OK to allow them to use the exit to leave the room.  If this
    is not defined, then exits work like in standard MUCK2.2.

  Cleaned up notify_listeners code.  Now NOTIFY and NOTIFY_EXCLUDE will not
    trigger _listen's that would run the current program.

  NOTIFY_EXCEPT has been removed and replaced by a $define to NOTIFY_EXCLUDE.
    It is effectively $define notify_except 1 swap notify_exclude $enddef

  There are now four levels of MUCKERs in fb4.0.  Level zero is a non-mucker.
    They cannot use the editor, and MUF programs owned by them run as if
    they were level 1 MUCKERs.
      Level one MUCKER's are apprentices.  Their powers are restricted as they
    cannot get information about any object that is not in the same room they
    are.  ie:  OWNER, NAME, LOCATION, etc all fail if the object isn't in the
    same room as the player.  Level one MUCKER programs always run as if they
    are set SETUID.  NOTIFY, NOTIFY_EXCEPT, and NOTIFY_EXCLUDE will refuse to
    send messages to rooms the user is not in.  Level one programs cannot use
    ADDPENNIES.  They also cannot set properties on objects not owned by the
    program's owner.
      Level two MUCKERs are also called Journeymen.  Their permissions are
    equivalent to the permissions for a normal MUCKER under older versions
    of the server.
      Level three MUCKERs are referred to as Masters.  They can use the con-
    nection info primitives (ie: CONDBREF, ONLINE, etc.), read the EXITS list
    of any room, use NEXTOBJ on objects, can use NEWROOM, NEWOBJECT, NEWEXIT,
    and COPYOBJ without limitations, can use QUEUE and KILL, and can override
    the permissions restrictions of MOVETO.  You only give a player MUCKER
    level 3 if they are very trusted.
      A player who is wizbitted is effectively Mucker Level 4.  MUCKER level
    four is required for the RECYCLE primitive, the CONHOST primitive, the
    FORCE primitive, and the SETOWN primitive.  ML4 also allows overriding
    of permissions of the SET* primitives, and property permissions.  Props
    not listed by NEXTPROP with ML3 are listed with ML4.
      The MUCKER level permissions that a program runs at is the lesser of
    it's own MUCKER level and the MUCKER level of it's owner.
      If it is owned by a player who is MUCKER level 2, and it is MUCKER
    level 3, then it runs at Muckr level 2.  The one exception to this is
    programs owned by a Wizard player.  They run at Mucker level 2 if the
    program itself is not wizbit, and at Mucker level 4 if the program IS
    set wizbit.
      Mucker level is referred to in flags lists by M# where the # is the
    Mucker level.  Level zero objects don't show a flag for it.  Example:
    Revar(#37PM3)
      In verbose flags lists, Mucker levels greater than zero are shown
    by MUCKER# where # is the mucker level.
      To set a level on a player or program, use the level number as the
    flag name.  MUCKER is the same as 2, and !MUCKER is the same as 0.
    Example:  @set Revar=2
      A player may set the MUCKER level on a program they own to any level
    lower than or equal to their own level, and a wizard may set a program
    or player to any MUCKER level.  A program cannot be set to Mucker Level
    Zero, since it has no meaning for programs. (You expect them to use the
    MUF editor or something?)
      When a program is created, it is automatically set to the same MUCKER
    level as the creating player.  When a program is loaded from the db, if
    it is Mucker Level 0, it is upgraded to Mucker Level 2.

  When a program crashes, now even the errors within interp_loop() will tell
    what MUF program dbref and line number it occurred at.


Added:

  INSTRING and RINSTRING are now inserver defines that let you do case
    insensitive versions of their INSTR and RINSTR counterparts.  They
    are effectively defined as:
        $define instring  tolower swap tolower swap instr  $enddef
        $define rinstring tolower swap tolower swap rinstr $enddef

  @uncompile command for uncompiling all the programs in memory.  This
    frees them from memory, and lets them be recompiled when they are
    next used.  This is a useful command to use when a macro is redefined.

  Ability to load Mage DB Dump Format databases.  (FurryMUCK.)

  RESTRICT_KILL #define in config.h that lets you compile the server with
    Kill_OK bits for players.  Both the killing player and the victim must
    have their KILL_OK flags set for the kill to work.

  There is now a #define option for limited disk basing.  #define DISKBASE
    in config.h to make the server not load up properties from the input
    database file until they are needed.  If an object's properties are
    not changed, and they haven't been accessed for longer than the database
    DUMP_INTERVAL, then it will clear the properties back out of memory when
    it comes time to dump the db again.  Properties for objects that have
    had some properties added/removed/changed will remain in memory.  When
    DISKBASE is defined, @stats will also tell how many objects are loaded
    into memory for wizards.

  Ability for a wizard to append a timestamped message to the MOTD file by
    using the command  'motd <message>'.  The file can also be cleared by
    a wizard simply by typing 'motd clear'.


New Primitives:

  FORK  ( -- i)  This primitive forks off a BACKGROUND (muf) process from
                   the currently running program.  It returns the pid of
                   the child process to the parent process, and returns a
                   0 to the child.  This does NOT do a UNIX fork.  It only
                   copies the current stack frame and puts the background
                   muf process on the time queue. (Requires Mucker Level 3)
                   FORK returns a -1 if the timequeue was full.

  STATS (d -- 7 ints)  Takes a dbref and returns 7 integers, giving, in order,
                        The total number of objects owned by the given dbref,
                        the number of rooms owned, the number of exits owned,
                        the number of things owned, number of programs owned,
                        number of players, and number of garbage items owned.
                        If the given dbref was #-1, then the stats are the
                        totals for the entire database. (Needs Mucker Level 3)

Return to the TinyMUCK Page

Page created by Telzey, and maintained by Tugrik d'Itichi.
Comments/Questions/Flames to: FMPages@furry.com