parent $user_parsers
object $verb_parser
var $root child_index 0
var $root fertile 0
var $root manager $verb_parser
var $root owners [$core]
var $root writable [$verb_parser]
var $root readable ['parameters, 'methods, 'code]
var $root trusted []
var $root owned [$verb_parser]
var $root inited 1
var $root dbref 'verb_parser
method match_verb
arg str, user;
var templates, template, fields, word, obj, verb_info, i, j, output;
// Resort to verb cache.
templates = $verb_cache.templates();
output = [];
catch ~objnf, ~verbnf {
for template in (templates) {
fields = match_template(strsub(template, "%this", "*"), str);
if (!fields)
continue;
j = 1;
for word in (explode(template)) {
if (word == "%this") {
obj = user.match_env_nice(fields[j]);
verb_info = obj.verb_info(template);
if (((verb_info[2]) != 'remote) && (!(user.local_to_environment(obj))))
user.tell("! You cannot do that from here.");
else
obj.(verb_info[1])(@fields);
return;
} else if (word == "*=*") {
j = j + 2;
} else {
j = j + 1;
}
}
}
} with handler {
switch (error()) {
case ~verbnf:
user.tell("! You can't do that to that object.");
default:
user.tell("! " + ((traceback()[1])[2]));
}
return;
}
.
method parse
arg user, str, next_parser, [other_parsers];
var templates, template, fields, word, obj, verb_info, i, j, output;
// Match verbs on objects.
// (this is a rather icky system involving the verb cache, etc..
// I'm planning to redo this completely eventually.
// Resort to verb cache.
templates = ($verb_cache.templates()) + (user.local_verb_templates());
output = [];
catch ~objnf, ~verbnf {
for template in (templates) {
fields = match_template(strsub(template, "%this", "*"), str);
if (!fields)
continue;
j = 1;
for word in (explode(template)) {
if (word == "%this") {
obj = user.match_env_nice(fields[j]);
verb_info = (| obj.verb_info(template) |);
if (!verb_info)
return "That object is not a part of the VR.";
if (((verb_info[2]) != 'remote) && (!(user.local_to_environment(obj))))
return "You cannot do that from here.";
else
return [obj, verb_info[1], @fields];
} else if (word == "*=*") {
j = j + 2;
} else {
j = j + 1;
}
}
}
} with handler {
return "You can't do that to that object.";
}
return next_parser.parse(user, str, @other_parsers);
.