new object $realm: $realm_settings, $event_handler, $has_name;
var $foundation defined_msgs = #[["night", #[['branches, ["general"]]]], ["predawn", #[['branches, ["general"]]]], ["dawn", #[['branches, ["general"]]]], ["morning", #[['branches, ["general"]]]], ["noon", #[['branches, ["general"]]]], ["afternoon", #[['branches, ["general"]]]], ["sunset", #[['branches, ["general"]]]], ["evening", #[['branches, ["general"]]]]];
var $foundation msgs = #[];
var $has_name name = ['uniq, "Realm", "the Realm"];
var $realm last_daytime = 0;
var $realm links = #[];
var $realm local = [];
var $root created_on = 796268969;
var $root defined_settings = #[["weather-time", #[['get, ['get_realm_setting]], ['parse, ['parse_weather_time]], ['format, ['format_weather_time]]]]];
var $root flags = ['methods, 'code, 'variables, 'core];
var $root help_node = $help_places_realms;
var $root inited = 1;
var $root managed = [$realm];
var $root manager = $realm;
var $root settings = #[["weather-time", [$weather_1, "spring", $climate_taobh_thiar, 0, $world_time, 0]], ["propagate", 0], ["map-position", 0]];
var $root trusted_by = [$world];
public method ._check_links() {
arg @propagate_check;
var i, j, k, d;
(caller() == $realm_admin_ui) || (> .perms(caller(), $realm) <);
d = #[];
for i in (links || #[]) {
for j in (i[2]) {
// Run at low priority...
refresh();
if (!(j[4])) {
if ((j[2]).is_connected_to(j[3]))
d = d.add_elem(i[1], j);
} else if (((j[2]).is_connected_to((j[4])[1])) && ((!find k in [1 .. ((j[4]).length()) - 1] where (refresh() && (!(((j[4])[k]).is_connected_to((j[4])[k + 1]))))) && (((j[4]).last()).is_connected_to(j[3])))) {
d = d.add_elem(i[1], j);
}
}
}
links = d;
if (propagate_check)
(| ((.parents())[1])._check_links(@propagate_check) |);
};
public method .add_exit_to() {
arg dest;
(> .perms(caller(), $place) <);
if ((dest.realm()) != this()) {
links = links || #[];
// Do a quick sanity check before adding a new cross-realm exit
._check_links();
// The format is: links, source, destination, path source->dest
links = links.add_elem(dest.realm(), [this(), sender(), dest, []]);
}
};
public method .advance_weather() {
arg ticked;
var d, new;
(caller() == $world) || (> .perms(sender()) <);
d = .get_setting("weather-time", $realm);
if (ticked) {
d = d.replace(2, $world_time.current_season());
new = (d[3]).advance(d[1], d[2], (d[4]) || []);
if (new != (d[1])) {
d = d.replace(1, new);
.set_setting("weather-time", $realm, d);
.realm_announce(new.eval_message("invoke", $weather, .ctext_variables()));
}
}
new = ((d[5]).daytime(d[6], (d[3]).daylength(d[2])))[2];
if (new != last_daytime) {
last_daytime = new;
.realm_announce(.eval_message(tostr(new), $realm, .ctext_variables()));
}
};
public method .cleanup_local() {
var i, t;
t = this();
local = filter i in (local) where ((| (i.realm()) == t |));
};
public method .core_realm() {
links = #[];
local = [];
};
public method .ctext_variables() {
var climate, weather, season, depend, timeobj, timezone, ret;
[weather, season, climate, depend, timeobj, timezone] = .get_setting("weather-time", $realm);
ret = (| climate.ctext_variables(weather, season) |) || #[];
ret = ret.add('daytime, timeobj.daytime(timezone, (| climate.daylength(season) |) || 0));
ret = ret.add('evaluator, $realm_base_eval);
return ret;
};
public method .format_weather_time() {
arg value;
var out, i;
if (!value)
return "None";
out = "%l %l in %l%l, %l".format((value[1]).name(), value[2], (value[3]).namef('ref), (value[4]) ? (" influenced by " + (map i in (value[4]) to (((i[1]).name()) + (((i[2]) == 50) ? "" : ((" = " + (i[2])) + "%"))).join("; "))) : "", (value[5]).namef('ref));
if ((value[6]) > 0)
out += "+";
if ((value[6]) != 0)
out += value[6];
return out;
};
public method .get_msg() {
arg name, definer;
var t;
if (!(t = pass(name, definer)))
return ((.parents())[1]).get_msg(name, definer);
else
return t;
};
public method .init_realm() {
local = [];
links = #[];
};
public method .local() {
return local;
};
frob method .name() {
arg @args;
return (> pass(@args) <);
};
public method .new() {
var i;
(sender().is($place)) || throw(~place, sender() + " is not a place.");
local = local.setadd(sender());
.cleanup_local();
return this();
};
public method .parse_weather_time() {
arg value;
var m, climate, depend, i, obj, tmp, str;
if (type(value) == 'list)
return value;
if ((!value) || (value == "none"))
return 0;
value = (| (value.regexp("^(.+) (.+) in (.+),([^+-]+)([+-] *[0-9]+)?$")).mmap('trim) |);
if (!value)
throw(~type, "Value is not parsable as weather/time data.");
if ((value.length()) < 5)
value += ["0"];
if ((m = (value[3]).match_pattern("* influenced by *"))) {
value = value.replace(3, (m[1]).trim());
depend = [];
for i in ((((m[2]).trim()).split(";")).mmap('trim)) {
refresh();
[tmp, (str ?= "=50%")] = (i.regexp("([^=]+)(= *[0-9]+%)?")).mmap('trim);
str = toint(((str.match_pattern("=*%"))[1]).trim());
if (!(obj = $place_lib.match_realm(tmp)))
throw(~match, ("Can't find realm " + tmp) + ".");
depend += [[obj, str]];
}
depend ?= 0;
} else {
depend = 0;
}
if ((m = (value[3]).match_pattern("*($*)")))
value = value.replace(3, "$" + (m[2]));
if ((m = (value[4]).match_pattern("*($*)")))
value = value.replace(4, "$" + (m[2]));
climate = (> $object_lib.to_dbref(value[3]) <);
return (> [climate.match_weather(value[1]), value[2], climate, depend, $object_lib.to_dbref(value[4]), toint((value[5]).replace(" ", ""))] <);
};
public method .place_destroyed() {
arg @args;
(sender() == (.manager())) || (> .perms(caller(), $place) <);
(| (local = local.setremove(sender())) |);
};
public method .realm_announce() {
arg message;
(caller() == this()) || (> .perms(sender()) <);
$world.send_event('realm_announce, message);
};
public method .realm_name() {
var realms;
realms = .realms();
if ((realms.length()) > 2)
realms = [realms[1], realms.last()];
return realms.join(", ");
};
public method .realms() {
var r;
if (definer() == this())
return [];
return [.name()] + (((.parents())[1]).realms());
};
protected method .set_realm_local() {
arg new;
local = new;
};
root method .uninit_realm() {
var x;
for x in (local)
(| x.set_realm($realm_of_creation) |);
};
root method .uninit_realms_frob() {
var x;
for x in (local)
(| (x[1]).set_realm($realm_of_creation) |);
};