/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
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) |);
};