tmi2_fluffos_v2/
tmi2_fluffos_v2/bin/
tmi2_fluffos_v2/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/ChangeLog.old/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/Win32/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/simuls/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/clone/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/command/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/data/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/master/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/log/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/u/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/tmp/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/windows/
tmi2_fluffos_v2/lib/
tmi2_fluffos_v2/lib/adm/
tmi2_fluffos_v2/lib/adm/daemons/languages/
tmi2_fluffos_v2/lib/adm/daemons/network/I3/
tmi2_fluffos_v2/lib/adm/daemons/virtual/
tmi2_fluffos_v2/lib/adm/daemons/virtual/template/
tmi2_fluffos_v2/lib/adm/news/
tmi2_fluffos_v2/lib/adm/obj/
tmi2_fluffos_v2/lib/adm/obj/master/
tmi2_fluffos_v2/lib/adm/priv/
tmi2_fluffos_v2/lib/adm/shell/
tmi2_fluffos_v2/lib/adm/tmp/
tmi2_fluffos_v2/lib/cmds/
tmi2_fluffos_v2/lib/d/
tmi2_fluffos_v2/lib/d/Conf/
tmi2_fluffos_v2/lib/d/Conf/adm/
tmi2_fluffos_v2/lib/d/Conf/boards/
tmi2_fluffos_v2/lib/d/Conf/cmds/
tmi2_fluffos_v2/lib/d/Conf/data/
tmi2_fluffos_v2/lib/d/Conf/logs/
tmi2_fluffos_v2/lib/d/Conf/obj/
tmi2_fluffos_v2/lib/d/Conf/text/help/
tmi2_fluffos_v2/lib/d/Fooland/adm/
tmi2_fluffos_v2/lib/d/Fooland/data/
tmi2_fluffos_v2/lib/d/Fooland/data/attic/
tmi2_fluffos_v2/lib/d/Fooland/items/
tmi2_fluffos_v2/lib/d/TMI/
tmi2_fluffos_v2/lib/d/TMI/adm/
tmi2_fluffos_v2/lib/d/TMI/boards/
tmi2_fluffos_v2/lib/d/TMI/data/
tmi2_fluffos_v2/lib/d/TMI/rooms/
tmi2_fluffos_v2/lib/d/grid/
tmi2_fluffos_v2/lib/d/grid/adm/
tmi2_fluffos_v2/lib/d/grid/data/
tmi2_fluffos_v2/lib/d/std/
tmi2_fluffos_v2/lib/d/std/adm/
tmi2_fluffos_v2/lib/data/adm/
tmi2_fluffos_v2/lib/data/adm/daemons/
tmi2_fluffos_v2/lib/data/adm/daemons/doc_d/
tmi2_fluffos_v2/lib/data/adm/daemons/emoted/
tmi2_fluffos_v2/lib/data/adm/daemons/network/http/
tmi2_fluffos_v2/lib/data/adm/daemons/network/services/mail_q/
tmi2_fluffos_v2/lib/data/adm/daemons/network/smtp/
tmi2_fluffos_v2/lib/data/adm/daemons/news/archives/
tmi2_fluffos_v2/lib/data/attic/connection/
tmi2_fluffos_v2/lib/data/attic/user/
tmi2_fluffos_v2/lib/data/std/connection/b/
tmi2_fluffos_v2/lib/data/std/connection/l/
tmi2_fluffos_v2/lib/data/std/user/a/
tmi2_fluffos_v2/lib/data/std/user/b/
tmi2_fluffos_v2/lib/data/std/user/d/
tmi2_fluffos_v2/lib/data/std/user/f/
tmi2_fluffos_v2/lib/data/std/user/l/
tmi2_fluffos_v2/lib/data/std/user/x/
tmi2_fluffos_v2/lib/data/u/d/dm/working/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/smtp/
tmi2_fluffos_v2/lib/doc/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/interactive/
tmi2_fluffos_v2/lib/doc/driverdoc/concepts/
tmi2_fluffos_v2/lib/doc/driverdoc/driver/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/arrays/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/buffers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/compile/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/ed/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/filesystem/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/floats/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/functions/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/general/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/mappings/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/numbers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/parsing/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/constructs/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/preprocessor/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/types/
tmi2_fluffos_v2/lib/doc/driverdoc/platforms/
tmi2_fluffos_v2/lib/doc/mudlib/
tmi2_fluffos_v2/lib/ftp/
tmi2_fluffos_v2/lib/include/driver/
tmi2_fluffos_v2/lib/log/
tmi2_fluffos_v2/lib/log/driver/
tmi2_fluffos_v2/lib/obj/net/
tmi2_fluffos_v2/lib/obj/shells/
tmi2_fluffos_v2/lib/obj/tools/
tmi2_fluffos_v2/lib/std/adt/
tmi2_fluffos_v2/lib/std/board/
tmi2_fluffos_v2/lib/std/body/
tmi2_fluffos_v2/lib/std/fun/
tmi2_fluffos_v2/lib/std/living/
tmi2_fluffos_v2/lib/std/object/
tmi2_fluffos_v2/lib/std/shop/
tmi2_fluffos_v2/lib/std/socket/
tmi2_fluffos_v2/lib/std/user/
tmi2_fluffos_v2/lib/std/virtual/
tmi2_fluffos_v2/lib/student/
tmi2_fluffos_v2/lib/student/kalypso/
tmi2_fluffos_v2/lib/student/kalypso/armor/
tmi2_fluffos_v2/lib/student/kalypso/rooms/
tmi2_fluffos_v2/lib/student/kalypso/weapons/
tmi2_fluffos_v2/lib/u/l/leto/
tmi2_fluffos_v2/lib/u/l/leto/cmds/
tmi2_fluffos_v2/lib/www/errors/
tmi2_fluffos_v2/lib/www/gateways/
tmi2_fluffos_v2/lib/www/images/
tmi2_fluffos_v2/old/
tmi2_fluffos_v2/win32/
// lock.c
// A standard inheritable lock object.
// Written by Dk@TMI-2, 12-13-92
// Mobydick made some small changes getting it moved into /std.
// This file used to inherit OBJECT. It seems preferable to let the locked
// object inherit OBJECT (or something that inherits it, like CONTAINER)
// rather than rely on the lock for these functions.

// These have to be prototyped now that OBJECT isn't inherited.

mixed query (string str) ;
int set (string str, mixed val) ;

// These also need to be prototyped.

int lock_func(string str);
void pick_lock(object ob, int n);

int lock(int n) {
    object ob;
    string str;
    
    if (n == 0) {
        return query("lock");
    }
    ob = query("current_key");
    if (!ob) {
        str = "none";
    } else {
        str = ob->query("to_lock");
    }
    if (!str || (str != query("key") && !lock_func(str))) {
        return query("lock");
    }
    if (str == query("key") || lock_func(str)) {
        if (n == -1) {
            if (query("lock") == -1) {
                write ("Already unlocked!\n");
                return -1;
            }
            if (query("lock") == 0) {
                notify_fail ("What?\n");
                return 0;
            }
            set("lock", query("lock") - (int)ob->query("lock_turn"));
            if (query("lock") < 1) {
                say (this_object()->query("short")+" unlocks with a click.\n");
                set("lock", -1);
                return -1;
            } else {
                write ("You fail!\n");
                say (this_player()->query("name")+" fails!\n");
            }
            return query("lock");
        }
        if (n == 0) {
            write ("Try as you might, you can't break this lock.\n");
            return query("lock");
        }
        if (n > ob->query("lock_turn") && n > 0)  n = ob->query("lock_turn");
        if (n > query("max_lock"))  n = query("max_lock");
        if (query("lock") == -1 && n > 0)  say ("The lock clicks shut.\n");
        set("lock", n);
        return n;
    }
    if (str == "none"); {
        pick_lock(this_player(), n);
    }
    return query("lock");
}

int lock_func(string str) {
    if (str == "skeleton")  return 1;
    return 0;
}

void pick_lock(object me, int n) {
    set("lock", n);
}

int lock_object(string str) {
    string str2, str3;
    object ob;
    
    if (!str) {
        notify_fail("Lock what?\n");
        return 0;
    }
    if (sscanf(str, "%s with %s", str2, str3) == 2) {
        ob = present(str3, this_player());
        if (!ob)
            ob = present(str3, environment(this_player()));
        if (ob) {
            set("current_key", ob);
            if (query("lock") == query("max_lock")) {
                write ("It's already fully locked!\n");
                return 1;
            }
	    if (member_array(str2,(string *)query("id"))==-1) {
		// Not for this object.
		return 0 ;
	    }
	    if ((int)this_object()->query_is_closed()==0) {
		notify_fail ("You can't lock it unless it's closed.\n") ;
		return 0 ;
	    }
            write ("You lock "+str2+" with "+str3+".\n");
            say (this_player()->query("name")+" locks "+str2+" with "+str3+".\n");
            lock((int)ob->query("lock_turn"));
            if (query("lock") <= 0) {
                write ("You fail!\n");
                say (this_player()->query("name")+" fails!\n");
            }
            return 1;
        }
        write ("I can't seem to find "+str3+" here...\n");
        return 1;
    }
    write ("How?\n");
    return 1;
}

int unlock_object(string str) {
    string str2, str3;
    object ob;
    
    if (!str) {
        notify_fail("Unlock what?\n");
        return 0;
    }
    if (sscanf(str, "%s with %s", str2, str3) == 2) {
        ob = present(str3, this_player());
        if (!ob)
            ob = present(str3, environment(this_player()));
        if (ob) {
            set("current_key", ob);
            if (query("lock") == -1) {
                write ("It's already unlocked!\n");
                return 1;
            }
            write ("You unlock "+str2+" with "+str3+".\n");
            say (this_player()->query("name")+" unlocks "+str2+" with "+str3+".\n");
            lock(-1);
            if (query("lock") != -1) {
                write ("You fail!\n");
                say (this_player()->query("name")+" fails!\n");
            }
            return 1;
        }
        write ("I can't seem to find "+str3+" here...\n");
        return 1;
    }
    write ("Use your pick skill for that...\n");
    return 1;
}

void init() {
    add_action("lock_object", "lock");
    add_action("unlock_object", "unlock");
}