parent $location
parent $public
parent $old_has_settings
object $place
var $root child_index 263
var $root fertile 1
var $root manager $place
var $root owned [$place]
var $root owners [$core]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $root inited 1
var $gendered gender $gender_neuter
var $described prose #[]
var $has_verbs verbs #[]
var $has_commands commands [["l?ook", 'look_cmd], ["exam?ine", 'examine_cmd]]
var $has_commands shortcuts []
var $root dbref 'place
var $named name ['uniq, "place"]
var $named name_aliases []
var $place realm 0
var $place exits 0
var $place coordinates 0
var $public public ['readable]
var $location contents []
var $old_has_settings setting_templates #[["look-exit-format", 'string], ["examine-exit-format", 'string]]
var $old_command_environment verb_cache #[]
var $old_command_environment command_cache [["l?ook", 'look_cmd], ["exam?ine", 'examine_cmd]]
var $old_command_environment shortcuts_cache []
method init_place
.perms($root, caller());
exits = [];
realm = $realm_of_creation.new();
coordinates = #[];
.
method uninit_place
var x;
.perms($root, caller());
for x in (exits)
(| x.destroy() |);
(| realm.place_destroyed(this()) |);
for x in (.area())
(| x.place_destroyed(this()) |);
(| $place_db.place_destroyed() |);
.
method environment
return pass() + exits;
.
method description
arg actor, [exclude];
var output, dark;
output = pass(actor, exclude);
output = output + (._desc_contents(actor, exclude));
output = output + (._desc_exits(actor, exclude));
return output;
.
method exits
return exits;
.
method add_exit
disallow_overrides;
arg coord1, coord2;
var exit;
// coordinates are not standard x/y, but radial/azimuth
.perms($exit, caller());
exit = sender();
(> ._add_exit(exit) <);
(> ._add_coordinate(exit, coord1, coord2) <);
(> ._add_coordinate(exit.dest(), coord1, coord2) <);
.
method _add_exit
disallow_overrides;
arg obj;
// use .add_exit()
.perms(sender(), 'this);
exits = [@exits, obj];
.
method _del_exit
disallow_overrides;
arg obj;
// use .del_exit()
.perms(sender(), 'this);
exits = setremove(exits, obj);
.
method del_exit
disallow_overrides;
var exit;
exit = sender();
.perms(caller(), $exit);
(| ._del_exit(exit) |);
(| ._del_coordinate(exit) |);
(| ._del_coordinate(exit.dest()) |);
.
method _add_coordinate
disallow_overrides;
arg obj, coord1, coord2;
.perms(sender(), 'this);
// should only be called from inside this object.
coordinates = dict_add(coordinates, obj, [coord1, coord2]);
.
method _del_coordinate
disallow_overrides;
arg obj;
.perms(sender(), 'this);
// should only be called from inside this object.
coordinates = dict_del(coordinates, obj);
.
method did_connect
if ((.visibility()) >= 0)
.announce((sender().namef('titled)) + " has connected.", sender());
.
method did_disconnect
if ((.visibility()) >= 0)
.announce((sender().namef('titled)) + " has disconnected.", sender());
.
method look_cmd
arg cmd;
var actor, text;
sender().tell(.short_description(sender(), sender()));
.
method realm
arg [args];
var tmp, r;
return realm;
.
method announce
arg str, [except];
var obj;
for obj in (.contents()) {
if (!(obj in except))
(| obj.tell(str) |);
}
.
method did_housekeep
arg who;
var message;
// catch ~msgnf {
catch any {
message = .get_message('housekeeper);
} with handler {
message = "The housekeeper hauls %N away";
}
// this will have to do until we get a correct action setup
.announce(strsub(message, "%N", who.namef()));
.
method set_name
arg new_name, [args];
var old_name;
old_name = .name();
(> pass(new_name, @args) <);
(| $place_db.room_changed_name(old_name) |);
.
method set_realm
arg frob_class, where;
.perms(sender());
if (!(frob_class.has_ancestor($frob_class)))
throw(~type, "Realm must be submitted as a frob class object.");
realm = frob_class.new([where]);
.
method short_description
arg actor, [exclude];
var output, dark;
output = pass(actor, exclude);
output = output + (._desc_contents(actor, exclude));
output = output + (._desc_exits(actor, exclude));
return output;
.
method _desc_contents
arg actor, dont_show;
var users, objects, output, obj, line;
// called by .description
.perms(sender(), 'this);
users = [];
objects = [];
for obj in (.contents()) {
if ((!(obj in dont_show)) || (| !(obj.obvious()) |)) {
if (obj.has_ancestor($body))
users = [@users, obj.namef('nactivity)];
else
objects = [@objects, obj.namef()];
}
}
output = [];
// we will get these both using @options eventually.
if (users) {
line = ($list.to_english(users)) + " ";
line = (line + ((listlen(users) > 1) ? "are" | "is")) + " here.";
output = [@output, line];
}
if (objects) {
line = "You see ";
line = (line + ($list.to_english(objects))) + " here.";
output = [@output, line];
}
return output;
.
method _desc_exits
arg actor, mode;
(> .perms(sender(), 'this) <);
return .visible_exits_formatted(actor, tosym((.setting("look-exit-format")) || "verbose"));
.
method visible_exits
var obv, exit;
obv = [];
for exit in (.exits()) {
if ((exit.visibility()) >= (.visibility()))
obv = [@obv, exit];
}
return obv;
.
method area
var out, x;
out = [];
for x in (dict_keys(coordinates)) {
if (x.has_ancestor($place))
out = out + [x];
}
return out;
.
method realm_name
return (((.name('def)) + " (") + (realm.name())) + ")";
.
method will_attach
arg type, obj;
if ((!(.is_publicly('extendable))) && (!(| .perms(obj) |)))
throw(~perm, ("Place refuses to link with " + (obj.namef('ref))) + ".");
.
method visible_exits_formatted
arg actor, how;
var output, ex, exits, line;
exits = .visible_exits();
switch (how) {
case 'none:
return [];
case 'brief:
if (!exits)
return [];
return ["Exits: " + ($list.to_english($list.map(exits, 'name), "none"))];
case 'average:
output = [];
for ex in (exits) {
line = (ex.name()) + " (";
line = line + ($list.to_english(ex.name_aliases(), "no, aliases"));
output = [@output, line];
}
return output ? ["Exits: " + ($list.to_english(output))] | [];
case 'long:
output = [];
for ex in (exits)
output = [@output, (((" " + (ex.name())) + " (to ") + ((ex.dest()).name())) + ")"];
return output ? ["Exits: ", @$list.lcolumnize(output, actor.linelen())] | [];
case 'verbose:
output = [];
for ex in (exits) {
line = ex.prose('short, "");
if (!line)
line = [ex.name()];
output = [@output, line[1]];
}
return output ? [output.to_string()] | [];
}
.
method place_destroyed
arg place;
// announces when a place is destroyed
.perms(caller(), $place, $realms_class);
(| ._del_coordinate(place) |);
.
method exit_arrival
arg actor;
var exit, omsg, msg;
exit = sender();
msg = (| exit.message('arrive) |);
omsg = (| exit.message('oarrive) |) || "%N arrives.";
// should be ctext...
if (msg) {
msg = strsub(msg, "%N", actor.name());
msg = strsub(msg, "%E", exit.name());
actor.tell(msg);
}
omsg = strsub(omsg, "%N", actor.name());
omsg = strsub(omsg, "%E", exit.name());
.announce(omsg, actor);
.
method exit_departure
arg actor;
var exit, msg, omsg;
exit = sender();
// remove the crit's later, it will have 4 whopping ticks
msg = (| exit.message('depart) |);
omsg = (| exit.message('odepart) |) || "%N leaves.";
// should be ctext...
if (msg) {
msg = strsub(msg, "%N", actor.name());
msg = strsub(msg, "%E", exit.name());
actor.tell(msg);
}
omsg = strsub(omsg, "%N", actor.name());
omsg = strsub(omsg, "%E", exit.name());
.announce(omsg, actor);
.
method long_description
arg actor, [exclude];
var output, dark;
output = pass(actor, exclude);
output = output + (._desc_contents(actor, exclude));
output = output + (._desc_exits(actor, exclude));
return output;
.
method examine_cmd
arg cmd;
var actor, text;
sender().tell(.long_description(sender(), sender()));
.
method set_dbref
disallow_overrides;
arg new_dbref;
if ((caller() != $place) && (!(sender() in ($sys.system()))))
throw(~perm, "Place dbrefs can only be changed by $place.");
(> pass(new_dbref) <);
.
method announce_to
arg type, str, [except];
var obj;
switch (type) {
case 'realm, 'sub_realm:
(.realm()).announce('sub, str, @except);
case 'super_realm:
(.realm()).announce('super, str, @except);
case 'local:
.announce(str, @except);
case 'area:
for obj in ((.area()) + [this()])
obj.announce(str, @except);
}
.