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()); };