FuzzBall Changes Summary
I'm still in the process of hypertexting this document. Until I'm done,
here's the flat ASCII version. -- Telzey
This file contains the main stuff that I would like to see in a pair of
docs files. The first file would be an administrators file, of interest
only to someone who would like to compile and run FB. The second file
would be one of interest to the players of the MUCK.
This file is loosely organized in sections that are progressively older,
outdated, and somewhat obsolete. The first section is current, and
sections earlier in the file supercede those later in the file for
accurracy. Sections are seperates by short ----- lines.
=========================================================================
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.
When a program crashes, now even the errors within interp_loop() will tell
what MUF program dbref and line number it occurred at.
Added:
@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.
(wizard only command)
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'.
-----
Changes:
@find and @owned can now let you search AGAINST object types. ie:
search for all dark non-exits with @find *=d!e
@entrances now lets you give a flagstring argument similar to what @find
and @owned let you specify. You could list all players who are homed
to the room you are in with @entrances here=p
There is now a maximum of 256 processes allowed on the time queue.
Once the queue is full, no more processes can be added to it until
some processes die.
Expanded the info that @ps tells you to also list how long a process
has been running, and how many instructions it's executed so far.
Also changed the way process ID's are handled so that a process
will keep the same unique ID as it runs.
If, while doing a pronoun_sub, the source string contains a %X type
code, (ie: %n, %p, %a, etc.) it first checks on the player to see if
they have an overriding property set, then it checks down the environ-
ment tree to see if there is an overriding default set, and THEN it
tries the built in defaults. This lets you do things like use %v as
a movement verb in @osucc messages, and have a default set for it.
Ie: '@set #0=%v:walks' so that the default could be something like
"Foxen walks north." But a player could set their own overrides like
'@set me=%v:pads' to get something like: "Foxen pads north."
When timestamps are updated on a room, it now updates timestamps in all
the rooms down the environment from it.
Added:
@usage will give stats about current resource usage for the MUCK.
-------
Changed:
Connections to the server, where they don't log into a character within
five minutes, get disconnected, to prevent tying up ports.
When a player connects or disconnects, the ":has connected/disconnected."
message now appears *before* the connect/disconnect actions are triggered.
An exit is now controlled by it's owner, the owner of it's source, and the
owner of the objects it is linked to.
Commands like @desc, @lock, @succ, @osucc, etc. now will work at a distance
for the owner of the object, if the object is referred to by dbref. This
facilitates builder programs.
@dig, @action, @open, and @create can now take a third parameter in the form:
@dig <roomname>=<parent>=<registername>
@action <actionname>=<source>=<registername>
@open <exitname>=<destination>=<registername>
@create <objectname>=<cost>=<registername>
where <registername> is an optional parameter that is the name that you
want it to register the object as. It registers the object in the
creating player's personal registration _reg/ propdir. For example:
if Joe_blow types '@dig Bedroom=$myenv=mybedroom' then it will create
the room "Bedroom" and set it's parent to the room referred to by $myenv
then registers it on the player as $mybedroom by setting the _reg/mybedroom
property to the dbref of the room object created. If the <registername>
parameter is excluded, then the object isn't registered. If you want
to, for example, @create an object, but not set it's value, but you DO
want to register it, then you just exclude That parameter, but remember
to put in both = signs. ie: @create Smiley Face Sticker==smiles
help, man, and news now can all have subtopics. If you use one without
an argument, then it lists a default file for the command. The default
files are 'data/man.txt', 'data/help.txt', and 'data/news.txt'. If a
topic is given, it lists the file by that name in the appropriate
command's subdirectory, if it exists. help uses the 'data/help' sub-
directory, man uses 'data/man', and news now uses 'data/news'.
As an example, if someone typed 'help building', it would list out the
'data/help/building' file out to them.
Improved the matching in @kill. Now you can @kill by a player's name, or
a program's registered name.
Added:
'@entrances <object>' will list all the objects in the db that are linked
to the given object. This means player and thing homes, room droptos,
and exit destinations.
-----
Changed:
@find now can take two arguments. The first argument is an smatch expr-
ession, and the second argument is a flag string expression. The syntax
is '@find <objectname>=<flags&type>'. The object name argument is an
smatch expression, meaning you could pass it something like:
'{gen?*|cmd?*}*' And it it would match all items who's name starts with
"gen" or "cmd" and have at least one character after that. (see the
description of the SMATCH primitive later in this document) The flags
string argument is rather different. It is a string that consists of
the letters you would see in the flags field after a dbref in an examine,
and negations. ie: "FW!D" would match programs that are set Wizard and
NOT set Debug. A wizard could find all the MUCKER players in the data-
base who were not wizards simply with a '@find =P!WM'. The '!' means
that it will match an object if the next flag is *NOT* set. (so long
as all the other flags match, also, of course)
If programs have consistent naming schemes on your MUCK, you could do a
'@find {gen-*|cmd-*}*=FWL' to find all Link_OK Wizard Programs in the
database who's names start with "gen-" or "cmd-" as an example.
NOTE: @find doesn't work the same as it used to. You need to give it
wildcards on either side of the matching string in the new setup.
For example, the OLD '@find foo' would be the same as the NEW
'@find *foo*=!E'
@owned now can take two arguments, similar to @find, but the first argument
hasn't been altered in its usage. The second argument is a flag string
of the same type used in the new @find. The syntax for the new @owned is
'@owned <player>=<flags&type>'. Example: to list all the link_ok prog-
rams, not set debug, owned by player Foo, you would use: "@owned foo=FL!D"
The matching routines no longer look for _progreg/xxxx, as I decided that
this is too useful a mod to keep for programs alone. It now looks for
$registered names in _reg/ for a STRING that contains the dbref of the
program to reference. The string can simply be a number like "1234" or
prepended by a # like "#1234".
Moved @desc, @succ, @fail, @drop, @osucc, @ofail, and @odrop into properties
in preparation for disk basing mods.
When a MUF program crashes, now, it will tell the player who to tell about
the crash. (The person who is the owner of the program) If the owner of
the program is the one running it when the program crashes, then it
simply tells them that it crashed. This is all in addition to the
earlier improvements that tell you what line and program it crashed at.
------
Changed:
@prog was renamed to @program. @prog still works as it is an abbreviation.
-----
Changed:
@queue was renamed to @ps.
@dequeue was renamed to @kill.
"@set <obj>=:" will no longer delete properties and propdirs whose
root property is an @prop or an ~prop. It will delete all of the
properties on an object That do not START with @ or ~. (ie: it will
NOT delete "/@combat/weapons/crossbow" but it WILL delete the prop
"/combat/@weapons/crossbow") This restriction applies only for non-
wizards. A wizard using "@set <obj>=:" will remove *ALL* of the
properties from the object.
-----
Changed:
Objects of type Thing can now contain either objects of type Program or
Thing. This means you can either use @tel or a MUF program using 'moveto'
to put stuff in a container, or take it out. You can @create a bag,
for example, and keep your programs and nicknacks in it. When you
are checked against a lock either in MUF with 'locked?' or by
triggering an action, it will look for items recursively within any
containers you are carrying, and will check for properties in the
same way. You cannot make a loop of containers (ie, a container
holding a container that holds the first) as it is prevented in both
@tel and 'moveto'
Made minor internal changes to the timequeue execution routines that
fixed a bug that let a single running program get 10 timeslices before
giving one to the players. This will make multitasking programs about
half as fast, but should make some stuff cleaner.
-----
Added:
Objects are now timestamped with the times the objects were created,
the time they were last modified, the time they were last used, and
the number of times it has been used. The lastused count and time are
updated on login and logout for players, on looking at an exit, room,
or thing, on running a program, on get'ting or drop'ping a thing,
or when reading a name/desc/succ/osucc/fail/ofail/drop/odrop, or a
property from a thing, room, or exit.
Modified is updated when the @name/desc/succ/osucc/fail/ofail/drop/odrop
or property are set to a new value on any object.
Created is the set only when an object is @created, @actioned, @dig'ged
@prog'ed or @pcreated, or if the similar functions are done in MUF.
-----
Changes:
The info command was cleaned up a bit, and should look better now.
Features added:
Program registration added: If you refer to a program in @link, @open,
@prog, @edit, or @set, with the syntax "$progname" then it will look
for a property named "_progreg/progname" in #0 containing an integer
value (not a string) that represents the dbref of the program. If it
exists, then the command will match the program. Also, if you @desc,
@succ, @drop, or @fail an object to start with "@$progname" then it
will run that program, similar to an "@1234" @desc/@succ/etc.
Examples of using progregs outside of MUF:
@edit $puzzle-reset
@link do-reset = $puzzle-reset
@desc me = @$longdesc %list[mydesc]
@succ west = @$gen-exit-messages
@set $puzzle-reset = DEBUG
-----
In the editor, you can do '<prognum> publics' to list all the public
functions of that program. This has the same restrictions as 'view'
does in the editor. The program must be either controlled by you, or
Link_OK.
Programs are now compiled when they are run or called instead of when
the databate is loaded. They are compiled with the uid of the owner
of the program.
If a program has the HAVEN flag set on it (HARDUID) then it runs with
the uid and permissions of the owner of the trigger of the program.
If the program is a timequeue event (with trigger of #-1), then it
will run with the permissions and uid of the program owner as in SETUID.
Added _connect and _disconnect:
A room or player may have a "_connect" property set that contains the
dbref of a progran to run when a player connects. The program must be
either link_ok or must be owned by the player connecting. When the
program is run, the string on the stack will be "Connect", the "loc @"
will be the location of the connecting player, the "me @" will be the
connecting player, and the "trigger @" (and "trig") will be #-1. All
programs referred to by _connect properties on the player, and on rooms
down the environment tree from the player, will be QUEUEd up to run.
When a player desconnects, programs referred to by _disconnect properties
will be run in a similar manner.
(connect and disconnect _actions_ are still implemented.)
@dequeue will now let you remove all events run by a specific player
or of a specific program with the syntax: @dequeue #xxx Where xxx
is the dbref of the program or player.
All the timequeue events of a program are now dequeued when the program
is recompiled or @recycled. This prevents the bug which would otherwise
crash the MUCK server.
Moving into a room, through a MUF moveto, or an exit, will @force a
'look' instead of doing an inserver standard look. When you connect,
it also @forces a 'look'. This means that you can make a look program
to have absolute say over what will be seen in the room.
@props can only be seen in examine by a wizard. Only a wiz may @set them.
~props can be seen in examines as normal, but only a wizard may @set them.
These two are similar to _props and .props in that property names
that start with a @ or a ~ are special protected properties in the
way described above, and that if any property in a property name path
starts with one of them, the property you are trying to access will
have the same permissions as well. ie: /stats/~combat/sword/hit
would have the same restrictions as ~attack. Warning, @set me=:
will still remove all properties on you, including @props and ~props.
Both of these property types can be changed by programs without
restrictions. If you need to make a property that cannot be changed
by the object owner, and that can only be read by a wizard program,
you could do something like name it: /.stats/~combat/sword/hit
'@set <object>=:abc' will no longer clear all the props on an object.
-----
Added Listeners:
A room or object may have a "_listen" property set that contains the
dbref of a program to run whenever a notify_except is done in that
room or in the room that contains the object. The program must
either be link_ok or must be owned by the owner of the object
containing the "_listen" property. When the program is run, the
parameter string will be the notify_except message, "loc @" will be
the room where the notify_except was given, and "trigger @" or "trig"
will be the object with the "_listen" property. A "_listen" program
may also be run by placing the "_listen" property in the environment
of a room or set of rooms.
-----
Made the interpreter re-entrant.
When a program crashed, it tells you in which program, and on what line the
crash happened. Debug will tell you what line each instruction is on.
The MOVETO primitive will now run programs in the @desc and @succ/@fail of a
room when moving a player.
The WHO list will now prepends an asterisk ('*') in front of the names of
people who are in the editor or in interactive mode.
You can now link objects to players, given that they are either you, or
link_OK, or that you are a wizard. This means that you could do a 'home'
and keep all your objects, if they are homed to you.
-----
Actions not on a room will only take you to the destination if, for both the
destination and the source, you either own them, or they are set JUMP_OK.
You can use 'news <topic>' now to list the files named 'game/data/news.txt.*'
You can also use 'info' to list the files in 'game/data/info/' and view then
with 'info <filename>'. The topic is case sensitive.
A wizard set QUELL is effectively a normal player with no wizardly powers.
Programs that test to see if a player is wizard will get a false response
from '"wizard" flag?' when the player is QUELLed. Wiz-bitted programs
will still act wizbitted whether or not the owner is QUELLED.
A player can set themselves "SILENT" and not see all the dbrefs and dark
objects that they own. They won't see objects in a dark room either.
They still control the objects though.
If no parent is given for a room when it is @dig'ed it will default to the
parent of the current room instead of #0.
Properties are now stored in AVL trees, and organized into directories of
properties. This speeds things up, and keeps you from being spammed on
examines. To examine the properties on an object, use 'ex <obj>=<propdir>'.
where to examine the base properties in an object, <propdir> would be '/'.
You can see the value of a single property with 'ex <object>=<propname>'.
Propdirs are a method of storing and organizing properties to speed
access and to provide a sort of built-in organization. The basic idea
is to make something similar to a 'filesystem' for properties. In this
analogy, each person would be a filesystem, with a root directory and
(theoretically) an infinite number of properties beneath that.
A property has been expanded with the idea that each property may now
contain a new property list -- the 'propdir'. properties can both have
a value (either integer or string as before) _and_ contain other
properties.
The actual directory entries may ALSO contain data. Propdirs' only
real 'visible' changes are in the names of properties -- '/' is used as
the property directory separator, and so will not appear in the names
of the properties when listed through 'examine' or MUF programs.
Property protections have also been expanded -- the . and _ may appear
either at the beginning of the property name or immediately following a
'/', and that property will have the appropriate protections. For
example, the property '/mail/.inbox/mesg/#' would have the same
protections as '.mesg#' would now.
There are two ways to remove a property list:
* First, and most straight forward, is to remove the property that
contains it. so, in the previous example, removing the property
'/mail/.inbox' would (recursively) remove all properties under
.inbox before removing .inbox itself.
* The second way is to remove all properties within the property list
yourself. When the last property is removed, the parent property
(the one that contained the property list) is examined to see if
contains data. If it does, then the property list only is
removed. If the property doesn't contain data then it is removed
also.
Because of the first method of removing propdirs, the ability to have a
property list and value in the same property should be used sparingly.
If you try to access a property ending in '/', in MUF, it will give a
programmer error, except in NEXTPROP, in which it will give the name of
the first property in that propdir.
The last visible, non-MUF change that propdirs bring is that 'examine'
will no longer show properties _directly_. Instead, where the properties
would normally be shown, it will say:
"[ Use 'examine <object>=/' to list root properties. ]"
Examine now can take an argument which is the property or propdir to
view. If the property name given ends with a '/', all properties in
property directory will be listed, otherwise the single property named
will be shown.
Internally, a few things changed. property lists are now stored as AVL
trees instead of straight lists, so there is a speed increase even if
propdirs are not directly used. This also means properties are kept in
sorted order and will be displayed that way.
'addprop' will no longer allow a ":" in the property name.
To clear a propdir's value without deleting the proptree below it,
from MUF do a '"" 0 addprop' to it.
A property can *not* have both a string and integer stored at the same
time anymore. The old property.c was lax and allowed this, even though
the integer value would be lost on dbload.
When a player connects to the server, the server basically does an:
"@force <player>='connect'". On player disconnection, it @forces a
'disconnect'. It will only @force a connect when you log in your first
connection, and @force a disconnect when your last connection is
terminated.
@queue will list all the time queue events waiting to run. @dequeue
will let you either delete a queue event by event number, delete all
events running a specific program or run by a specific player, or
clear the entire queue with '@deq all'
@dequeue will only let you remove events on programs you own, or any
event if you are a wizard. @queue will only list events on programs
you own, or all events, if you are a wizard.
If a program is running, it will delay execution of queue events until
after the program finishes, or executes a READ or SLEEP command.
Any wizard can do an @pcreate, even when GOD_PRIVS is defined.
Return to the TinyMUCK Page
Page created by Telzey, and maintained by Tugrik d'Itichi.
Comments/Questions/Flames
to: FMPages@furry.com