/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
new object $filtered_frob: $libraries;

var $filtered_frob default_value = #[['sight, 10], ['hearing, 10]];
var $root created_on = 860590309;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root inited = 1;
var $root managed = [$filtered_frob];
var $root manager = $filtered_frob;

public method .default_value() {
    return default_value;
};

public method .effects() {
    arg what;
    
    return (what.contains('effects)) ? (what['effects]) : [];
};

public method .is_noticed() {
    arg value, f;
    var i;
    
    return find i in [1 .. listlen(value)] where ((value[i]) >= (f[i]));
};

public method .message() {
    arg what;
    
    return what['message];
};

public method .new_with() {
    arg msg, sender;
    
    if (type(msg) != 'frob)
        msg = (<$message_frob, msg>);
    return (<this(), (((.default_value()).add('message, msg)).add('propagator, sender))>);
};

public method .new_with_message() {
    arg msg, sender;
    
    return (<(.this()), (((.default_value()).add('message, msg)).add('propagator, sender))>);
};

public method .propagate() {
    arg value, prop;
    var i, out, dflt, l, eff, f, n;
    
    if ((type(value) == 'frob) && (class(value) == $message_frob))
        value = .new_with(value, sender());
    out = #[];
    eff = prop.effect();
    f = prop.senses();
    dflt = (f.contains('any)) ? (f['any]) : 1000000;
    n = 0;
    for i in (value) {
        if ((i[1]) in ['message, 'propagator, 'effects]) {
            out = out.add(@i);
        } else {
            if (f.contains(i[1]))
                l = (i[2]) - (f[i[1]]);
            else
                l = (i[2]) - dflt;
            if (l > 0) {
                out = out.add(i[1], l);
                n++;
            }
        }
    }
    if (!n)
        return 0;
    if (eff)
        out = out.add('effects, ((| out.effects() |) || []) + [eff]);
    return (<this(), out>);
};

public method .sensory() {
    arg what;
    
    (| (what = what.del('message)) |);
    (| (what = what.del('effects)) |);
    (| (what = what.del('propagator)) |);
    return what;
};