lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

/*
** openable.c (M_OPENABLE)
**
** This object provides base open/close capabilities for an OBJ
**
**
//### doc forthcoming...
*/

#include <hooks.h>
#include <flags.h>

/*
** From OBJ::description
*/
void set_in_room_desc(string arg);
string the_short();
varargs void add_adj();
varargs void remove_adj();

private string open_msg =  "$N $vopen a $o.";
private string close_msg = "$N $vclose a $o.";
private string open_desc;
private string closed_desc;

mixed call_hooks(string, int);
void add_hook(string, function);
void resync_visibility();
int test_flag(int which);
void assign_flag(int which, int state);

//:FUNCTION do_on_open
// Called from open_with() so modules that inherit from M_OPENABLE
// Don't have to catch the "open" hook.
void do_on_open() {
    /* Overload this later */
}

//:FUNCTION do_on_close
// Called from close() so modules that inherit from M_OPENABLE
// Don't have to catch the "close" hook.
void do_on_close() {
    /* Overload this later */
}

string opened_attributes() { return "(open)"; }

int openable() { return 1; }

int query_closed() { return !test_flag(F_OPEN); /* closed; */ }

void set_closed(int x)
{
    assign_flag(F_OPEN, !x);

    /* Commenting this out for now -- Marroc
	remove_adj("closed", "open");
	if (x)
	    add_adj("closed");
	else
	    add_adj("open");
    */

    if (open_desc && !x) 
	set_in_room_desc(open_desc);
    if (closed_desc && x)
	set_in_room_desc(closed_desc);

    /* our inventory visibility probably just changed. */
    resync_visibility();
}


void set_open_desc( string desc )
{
    open_desc = desc;
    if (!query_closed()) set_in_room_desc(desc);
}

void set_closed_desc( string desc )
{
    closed_desc = desc;
    if (query_closed()) set_in_room_desc(desc);
}

string query_closed_desc() { return closed_desc; }

string query_open_desc() { return open_desc; }

void set_open_msg(string new_msg)
{
    open_msg = new_msg;
}

void set_close_msg(string new_msg)
{
    close_msg = new_msg;
}

varargs int open_with(object with)
{
    string ex;

    if (!query_closed())
    {
	write("It is already open.\n");
	return 1;
    }

    //:HOOK prevent_open
    //A yes/no/error hook which can prevent an object from being opened.

    ex = call_hooks("prevent_open", HOOK_YES_NO_ERROR);
    if (!ex) ex = capitalize(the_short() + " doesn't seem to want to open.\n");
    if (stringp(ex)) {
	write(ex);
	return 1;
    }

    this_body()->simple_action(open_msg, this_object());
    set_closed(0);
    if (ex = inv_list(all_inventory())) {
	write("Inside, you find:\n"+ex);
    }

    do_on_open();

    //:HOOK open
    //called when an object is opened.  The return value is ignored.
    call_hooks("open", HOOK_IGNORE);

    return 1;
}

mixed do_close() {
    mixed tmp;
    if (query_closed()) {
	write("It is already closed.\n");
	return 1;
    }
    //:HOOK prevent_close
    //A yes/no/error hook that can prevent an object from being closed
    tmp = call_hooks("prevent_close", HOOK_YES_NO_ERROR);
    if (!tmp) tmp = capitalize(the_short()) + " doesn't seem to want to close.\n";
    if (stringp(tmp)) return tmp;

    this_body()->simple_action(close_msg, this_object());
    set_closed(1);    
    do_on_close();

    //:HOOK close
    //called when an object is closed.  The return value is ignored.
    call_hooks("close", HOOK_IGNORE);

    return 1;
}

int is_open()
{
    return !query_closed();
}

/* Verb interaction */
mixed direct_open_obj(object ob) {
    object where = environment(this_object());

    if(where != this_body() && where != environment(this_body()) )
	return "#You do not have that.\n";
    if (!query_closed())
	return "It is already open.\n";
    return 1;
}

mixed direct_close_obj(object ob) {
    object where = environment(this_object());
    if (where != this_body() && where!= environment(this_body()) )
	return "#You do not have that.\n";
    if (query_closed())
	return "It is already closed.\n";
    return 1;
}


string extra_long_stuff()
{
    return capitalize(the_short()) + " is " + (query_closed() ? "closed" : "open") + ".\n";
}


// You should do this, or call set_closed() when you create an openable,
// so that the proper adjective gets initialized.
void internal_setup() {
    set_closed(1);

    add_hook("extra_long", (: extra_long_stuff :));
    add_hook("prevent_look_in", (: query_closed() ? "It is closed.\n" : (mixed)1 :));
}

mapping lpscript_attributes() {
    return ([ 
      "closed" : ({ LPSCRIPT_INT, "setup", "set_closed" }),
    ]);
}