parent $has_verbs
parent $named
object $described
var $described prose #[]
var $root child_index 0
var $root owners [$described]
var $root fertile 0
var $has_verbs verbs #[["l?ook at %this", ['look_vrb, 'noremote]], ["l?ook %this", ['look_vrb, 'noremote]], ["exam?ine %this", ['examine_vrb, 'remote]]]
var $root inited 1
var $root owned [$described]
var $root manager $described
var $root writable [$described]
var $root readable ['parameters, 'methods, 'code]
var $root dbref 'described
var $named name ['uniq, "Generic Described Object"]
var $named name_aliases []
method init_described
.perms($root, caller());
prose = #[];
.
method description
arg actor, [exclude];
var out;
// similar to MOO's :look_self()
// meant to be changed by descendants, if they so desire to.
return [.name('def), @.prose('short)];
.
method look_vrb
arg vrb, [args];
var actor;
sender().tell(.short_description(sender(), sender()));
.
method prose
arg type, [args];
var type, def;
def = [@args, ["You see nothing special"]][1];
switch (type) {
case 'literal:
return prose;
default:
return (| prose[type] |) || ((| prose['short] |) || def);
}
.
method descriptionf
arg actor, exclude, [args];
var out, part, type;
// lists should be ['methodname, args for method]
// symbols are shortcuts, to be defined on descendants.
out = [];
for part in (args) {
type = type(part);
switch (type) {
case 'list:
out = out + ((| .(part[1])(@sublist(part, 2)) |) || []);
case 'symbol:
// ignore them, they should have been dealt with by now.
}
}
return out;
.
method set_prose
arg ptype, new_prose;
// ptype should be either 'short or 'long
// prose should be a list of strings
.perms(sender(), 'manager);
if (type(ptype) != 'symbol)
throw(~type, "Prose type can be either 'short or 'long.");
if (type(new_prose) != 'list)
throw(~type, "Prose must be given as a list of strings.");
if ((!new_prose) || (!(new_prose[1])))
prose = dict_del(prose, ptype);
else
prose = dict_add(prose, ptype, new_prose);
.
method examine_vrb
arg vrb, [args];
var actor;
sender().tell(.long_description(sender(), sender()));
.
method long_description
arg actor, [exclude];
var out;
// intended to be redefined by children.
return [.name('def), @.prose('long)];
.
method short_description
arg actor, [exclude];
var out;
// intended to be redefined by children.
return [.name('def), @.prose('short)];
.