new object $located: $physical;
var $described prose = [];
var $has_name name = ['uniq, "Generic Located Object", "the Generic Located Object"];
var $located inited = 0;
var $located location = $lost_and_found;
var $located obvious = 1;
var $root created_on = 796268969;
var $root flags = ['methods, 'code, 'variables, 'core];
var $root managed = [$located];
var $root manager = $located;
protected method .did_move() {
arg mover, old_place;
// cleanup events
.unhook_events('move, old_place);
old_place.send_event('movement, 'leave, old_place);
location.send_event('movement, 'arrive);
.hook_events('move);
};
public method .environment() {
return [this()] + ((location.environment()).setremove(this()));
};
root method .init_located() {
location = $void;
location.add_sender_to_contents();
obvious = 1;
};
public method .is_obvious_to() {
arg whom;
return .is_visible_to(whom);
};
public method .location() {
return location || $void;
};
public method .match_environment() {
arg str;
var thing, matches;
if (str == "here")
return location;
return (> pass(str) <);
};
public method .match_environment_all() {
arg s;
if (s == "here")
return [location, @(> pass(@args) <)];
else
return (> pass(s) <);
};
public method .move_to(): nooverride {
arg place;
var old;
// Don't do anything if we're already here.
if (place == location)
return;
if (!(place.has_ancestor($location)))
throw(~type, "Argument is not a location.");
// Notify involved parties of impending move, allowing them to throw
// errors.
if (!valid(location))
location = $nowhere;
(> .will_move(sender(), place) <);
(> location.will_leave(place) <);
(> place.will_arrive(location) <);
// Set location.
old = location;
location = place;
old.del_sender_from_contents();
place.add_sender_to_contents();
// Notify involved parties of completed move, in reverse order.
place.did_arrive(old);
old.did_leave(place);
.did_move(sender(), old);
};
public method .obvious() {
return obvious;
};
public method .realm() {
return realm;
};
public method .realm_name() {
arg @args;
return (.location()).realm_name(@args);
};
public method .set_obvious() {
arg obv;
.perms(sender());
obvious = obv;
};
public method .uninit_guest_guest() {
if (caller() != $root)
throw(~perm, "Caller is not root.");
location.del_sender_from_contents();
location = 0;
};
root method .uninit_located() {
(.location()).del_sender_from_contents();
};
public method .will_move() {
arg mover, place;
};