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:
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.
@set me=first:a property. @set me=second:another property. @set me=first/one:A property in a propdir @set me=first/two:Another property in a propdir @set me=third/prime:threeOkay, now lets see what properties we have. We use the examine command to do that, with a second argument, to tell it what we want to list in the way of properties. In this case, since we want to list the base level properties, we use '/'.
ex me=/
first/: (string) a property.
second: (string) another property.
third/: (no value)
Okay, it has a few properties with the first part of the names of the
properties that we set. The /'s at the end of some of the property
names means that there are sub-properties that we can list. When we
set a property like 'first/one', it's actually creating a sub-property
named 'one' beneath a property named 'first'. If 'first' doesn't
already exist, then it will create that property. Let's list what
sub-properties we created under 'first'.
ex me=first/
first/one: (string) A property in a propdir.
first/two: (string) Another property in a propdir.
Here we see the properties that we set as sub-properties under 'first'.
We examined for 'first/' to list the sub-properties. The / at the end
of the name tells the game that we want it to list the sub-properties
of that property, and not that property's value itself. Lets see what
value the property 'first' has, itself. To do this we leave off the '/'
ex me=first
first/: (string) a property.
Okay, lets say that we just want to see the value of the sub-property
named 'one', under the property 'first'. We can list it as follows:
ex me=first/one
first/one: (string) A property in a propdir.
If the property or sub-property that you specify does not exist, it
will complain about it.
ex me=first/three
No property found.
If a property was created to contain a sub-property, but was never given
a value itself, it is listed as having no value. It has sub-properties,
however.
ex me=third
third/: (no value)
Let's list those sub-properties.
ex me=third/
third/prime: (string) three
Okay, let's delete the sub-property 'prime', from under the property
'third'. To do this, we act like we are setting the variable again,
except that we are giving it no value this time.
@set me=third/prime:
ex me=third/
No properties listed.
There. It's gone. Now let's list the bottom level properties again.
ex me=/
first/: (string) a property.
second: (string) another property.
Whoops! The property 'third' is gone too! This is because properties
with no values are automatically deleted when their last sub-property
is deleted. Let's delete a subproperty from 'first', now.
@set me=first/one:
ex me=/
first/: (string) a property.
second: (string) another property.
The property 'first' still exists, with it's string value, and it still
has sub-properties. Lets list those.
ex me=first/
first/two: (string) Another property in a propdir.
[Here we see that the sub-property 'one' is gone, as we expected. Let's
see what happens when you erase a property that has sub-properties.
@set me=first:
ex me=/
second: (string) another property.
The property 'first' is gone.
ex me=first/
No properties listed.
And the subproperty it had is gone too! Let's remake the 'first' prop.
@set me=first:again, a property.
ex me=/
first: (string) again, a property.
second: (string) another property.
We have two properties again, and no sub-properties. It should be
noted that sub-properties can have sub-sub-properties, and they can
contain even subbier properties, and so on and so forth.
@set me=first/one:uno
@set me=first/one/example:dos
@set me=first/two/example:tres
@set me=first/one/example/cat:meow
ex me=first/
first/one/: (string) uno
first/two/: (no value)
ex me=first/one/
first/one/example/: (string) dos
ex me=first/one/example/
first/one/example/cat: (string) meow
There is a special case in examine to let us list ALL the properties and
sub-properties of a prop. To use it, we just specify '**' as a propdir.
For example, to list all sub-properties and sub-sub-properties, etc.,
under 'first', you would do the following:
ex me=first/**
first/one/: (string) uno
first/one/example/: (string) dos
first/one/example/cat: (string) meow
first/two/: (no value)
first/two/example/: (string) tres
Let's delete all the properties on the object, now. To do that, we
specify no property name or value when we use @set. Nothing but a
colon.
@set me=:
ex me=/
No properties listed.
All gone!