parent $foundation
object $environment
var $root child_index 0
var $root fertile 0
var $root manager $environment
var $root owned [$environment]
var $root owners [$core]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $root inited 1
var $root dbref 'environment
method environment
return [];
.
method match_environment
arg str;
var obj, env, found, match;
if (!str)
throw(~objnf, "No \"\" in environment.", str);
// Handle special cases.
if (str == "me") {
return this();
} else if (((str[1]) == "$") || ((str[1]) == "#")) {
// obj = (| get_objnum(tosym(substr(str, 2))) |);
// if (!valid(obj))
// throw(~objnf, "No such object " + str, str);
return $object.to_dbref(str);
} else {
env = .environment();
found = [];
if (str in ["it", "him", "her"]) {
match = (| sender().match_context(str) |);
if ((!match) || ((match.location()) != (sender().location()))) {
for obj in (env) {
if ((| obj.gender_context() |) == str)
found = [@found, [obj, 1]];
}
} else {
found = [[match, 1]];
}
} else {
for obj in (env) {
if ((obj.name('literal)) == str)
return obj;
match = obj.match_name(str);
if (match)
found = found + [[obj, match]];
}
if (!found) {
for obj in (env) {
match = obj.match_name_aliases(str);
if (match)
found = found + [[obj, match]];
}
}
}
if (!found)
throw(~objnf, ("No \"" + str) + "\" in environment.", str);
if (listlen(found) == 1) {
return (found[1])[1];
} else {
match = $list.min(@$list.slice(found, 2));
if (($list.count(match, $list.slice(found, 2))) == 1)
return (found[match in ($list.slice(found, 2))])[1];
else
throw(~ambig, ("\"" + str) + "\" can match more than one object", [$list.slice(found, 1), str]);
}
}
.
method local_to_environment
arg obj;
return obj in (.environment());
.