/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
new object $thing: $located;

var $described prose = [];
var $has_commands local = #[];
var $has_commands remote = #[["@boot", [["@boot", "*", "@boot <this>", 'boot_cmd, #[[1, ['this, []]]]]]]];
var $has_commands shortcuts = #[];
var $has_name name = ['normal, "thing", "a thing"];
var $located location = $void;
var $located obvious = 1;
var $root created_on = 796268969;
var $root defined_settings = #[["home", #[['get, ['home]], ['parse, ['parse_home]]]], ["gender", #[['get, ['gender]], ['set, ['set_gender]], ['parse, ['parse_gender_setting]]]], ["lock", #[['get, ['get_lock]], ['set, ['set_lock]], ['parse, ['parse_lock]], ['format, ['format_lock]]]]];
var $root fertile = 1;
var $root flags = ['methods, 'code, 'fertile, 'variables, 'core];
var $root inited = 1;
var $root managed = [$thing];
var $root manager = $thing;
var $root settings = #[["home", $lost_and_found]];
var $thing gender = 0;
var $thing lock = <$true_lock_frob, []>;

public method .boot_cmd() {
    arg cmdstr, cmd, this;
    var loc, dest, exit;
    
    loc = .location();
    if (!(| .perms(sender(), 'manager) |)) {
        .tell((((sender().name()) + " tried to boot you from ") + (loc.name())) + "!");
        loc.announce((((((sender().name()) + " tried to boot ") + (.name())) + " from ") + (loc.name())) + "!", sender(), this());
        return ((("Only " + ((loc.manager()).name())) + " can boot people from ") + (loc.name())) + "!";
    }
    dest = .home();
    catch any {
        sender().tell(("You boot " + (.name())) + ".");
        loc.announce((((((sender().name()) + " boots ") + (.name())) + " from ") + ((.location()).name())) + ".", this(), sender());
        if ((sender().location()) != loc)
            (sender().location()).announce((((((sender().name()) + " boots ") + (.name())) + " from ") + ((.location()).name())) + ".", this(), sender());
        (> .move_to(dest) <);
    } with {
        return (traceback()[1])[2];
    }
};

public method .check_gender() {
    arg definer, value, @args;
    var g, gs;
    
    gs = [$gender_female, $gender_male, $gender_neuter];
    g = value in (gs.mmap('name));
    if (!g)
        throw(~set, "Gender must be one of: " + ((gs.mmap('name)).to_english("", " or ")));
    return gs[g];
};

public method .directed_tell() {
    arg @args;
    
};

root method .format_lock() {
    arg value;
    var unparse;
    
    unparse = value.unparse();
    if (unparse == "yes")
        return "unlocked";
    else if (unparse == "no")
        return "locked";
    return unparse;
};

public method .gender() {
    arg @args;
    
    return gender;
};

public method .gender_context() {
    return gender.pronoun('po);
};

public method .get_lock() {
    arg name, definer;
    
    return lock || (<$true_lock_frob, []>);
};

public method .home() {
    arg @args;
    var home;
    
    home = .get_local_setting("home", $thing);
    if (home)
        return home;
    if ((.manager()).is($user))
        return .manager();
    return $lost_and_found;
};

root method .init_thing() {
    gender = $gender_neuter;
};

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

public method .lock_cmd() {
    arg cmdstr, cmd, this;
    
    if (!(| .perms(sender()) |))
        return ((("Only " + ((.manager()).name())) + " can lock ") + (.name())) + "!";
    lock = $false_lock_frob.new();
    return "You lock " + (.name());
};

public method .lock_with_cmd() {
    arg cmdstr, cmd, this, prep, str;
    
    if (!(| .perms(sender()) |))
        return ((("Only " + ((.manager()).name())) + " can lock ") + (.name())) + "!";
    catch ~objnf, ~parse {
        lock = $lock_parser.parse(str, sender());
        return ((((("You lock " + (.name())) + " ") + prep) + " ") + (lock.lock_name('thing))) + ".";
    } with {
        switch (error()) {
            case ~objnf:
                return "Object not found in lock string.";
            case ~parse:
                return "Invalid lock string.";
        }
    }
};

public method .parse_gender_setting() {
    arg value, @args;
    var g, gs;
    
    gs = [$gender_female, $gender_male, $gender_neuter];
    g = value in (gs.mmap('name));
    if (!g)
        throw(~set, "Gender must be one of: " + ((gs.mmap('name)).to_english("", " or ")));
    return gs[g];
};

public method .parse_home() {
    arg value, @args;
    var home;
    
    home = (> .match_environment(value) <);
    if ((!(home.trusts(sender()))) && (!(home.get_setting("public-home", $place))))
        throw(~notpublic, ("You do not have permission to make " + (home.name())) + " your home.");
    return home;
};

public method .parse_lock() {
    arg value;
    
    if (value in ["lock", "locked"])
        value = "no";
    else if (value in ["unlock", "unlocked"])
        value = "yes";
    return (> $lock_parser.parse(value, user() || this()) <);
};

protected method .set_gender() {
    arg name, definer, value;
    
    (> .perms(sender()) <);
    gender = value;
};

protected method .set_lock() {
    arg name, definer, value;
    
    if (class(value) == $true_lock_frob)
        (| clear_var('lock) |);
    else
        lock = value;
};

public method .tell() {
    arg @args;
    
};

public method .try_lock() {
    arg mover;
    
    return lock && ((mover != $exit) && (lock.try(mover)));
};

public method .unlock_cmd() {
    arg cmdstr, cmd, this;
    
    if (!(| .perms(sender()) |))
        return ((("Only " + ((.manager()).name())) + " can lock ") + (.name())) + "!";
    lock = $true_lock_frob.new();
    return "You unlock " + (.name());
};

public method .will_move() {
    arg mover, place;
    
    (> pass(mover, place) <);
    if (mover.is($housekeeper))
        return;
    if (lock && ((mover != $exit) && (!(lock.try(mover)))))
        throw(~locked, ((((.name()).capitalize()) + " is locked to ") + (lock.lock_name('thing))) + ".");
    else if (!(.is_writable_by(sender())))
        throw(~move, "You cannot move " + this());
};