final_realms_fluffos_v1/
final_realms_fluffos_v1/bin/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/ChangeLog.old/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/Win32/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/simuls/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/clone/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/command/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/data/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/etc/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/master/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/log/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/compiler/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/efuns/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/operators/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/u/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/tmp/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/windows/
final_realms_fluffos_v1/lib/baseobs/guilds/
final_realms_fluffos_v1/lib/baseobs/misc/
final_realms_fluffos_v1/lib/baseobs/races/shadows/
final_realms_fluffos_v1/lib/cmds/god/
final_realms_fluffos_v1/lib/cmds/handlers/
final_realms_fluffos_v1/lib/cmds/handlers/cmds/
final_realms_fluffos_v1/lib/d/heaven/
final_realms_fluffos_v1/lib/d/heaven/heaven/ave/
final_realms_fluffos_v1/lib/d/mudlib/
final_realms_fluffos_v1/lib/d/newbie/
final_realms_fluffos_v1/lib/d/newbie/docs/
final_realms_fluffos_v1/lib/d/newbie/drow/armour/
final_realms_fluffos_v1/lib/d/newbie/drow/items/
final_realms_fluffos_v1/lib/d/newbie/drow/mobs/
final_realms_fluffos_v1/lib/d/newbie/drow/oldmobs/
final_realms_fluffos_v1/lib/d/newbie/drow/weapons/
final_realms_fluffos_v1/lib/d/newbie/duergar/weapons/
final_realms_fluffos_v1/lib/d/newbie/dwarf/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/cafe/
final_realms_fluffos_v1/lib/d/newbie/elf/chars/equip/
final_realms_fluffos_v1/lib/d/newbie/elf/items/armours/
final_realms_fluffos_v1/lib/d/newbie/elf/items/obj/
final_realms_fluffos_v1/lib/d/newbie/elf/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/quick_fix/
final_realms_fluffos_v1/lib/d/newbie/gnome/armour/
final_realms_fluffos_v1/lib/d/newbie/gnome/buildings/
final_realms_fluffos_v1/lib/d/newbie/gnome/items/
final_realms_fluffos_v1/lib/d/newbie/gnome/npcs/clones/
final_realms_fluffos_v1/lib/d/newbie/gnome/rooms/northrooms/
final_realms_fluffos_v1/lib/d/newbie/gnome/weapons/
final_realms_fluffos_v1/lib/d/newbie/goblin/armour/
final_realms_fluffos_v1/lib/d/newbie/goblin/items/
final_realms_fluffos_v1/lib/d/newbie/grads/log/
final_realms_fluffos_v1/lib/d/newbie/grads/npcs/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/cave1/
final_realms_fluffos_v1/lib/d/newbie/grads/temp/
final_realms_fluffos_v1/lib/d/newbie/guests/weapons/
final_realms_fluffos_v1/lib/d/newbie/half-elf/items/
final_realms_fluffos_v1/lib/d/newbie/half-elf/newroomss/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/castle/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/drows/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/savannah/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/secret/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/town/
final_realms_fluffos_v1/lib/d/newbie/halfling/
final_realms_fluffos_v1/lib/d/newbie/halfling/misc/
final_realms_fluffos_v1/lib/d/newbie/halfling/rooms/cave/
final_realms_fluffos_v1/lib/d/newbie/human/
final_realms_fluffos_v1/lib/d/newbie/human/armour/
final_realms_fluffos_v1/lib/d/newbie/human/monsters/
final_realms_fluffos_v1/lib/d/newbie/human/obj/
final_realms_fluffos_v1/lib/d/newbie/human/weapons/
final_realms_fluffos_v1/lib/d/newbie/lizard/armour/
final_realms_fluffos_v1/lib/d/newbie/lizard/items/
final_realms_fluffos_v1/lib/d/newbie/lizard/underwater/
final_realms_fluffos_v1/lib/d/newbie/lizard/weapons/
final_realms_fluffos_v1/lib/d/newbie/logs/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/rooms/
final_realms_fluffos_v1/lib/d/newbie/newelf/
final_realms_fluffos_v1/lib/d/newbie/newelf/chars/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/recopied/
final_realms_fluffos_v1/lib/d/newbie/newelf/obj/
final_realms_fluffos_v1/lib/d/newbie/newelf/quest_docs./
final_realms_fluffos_v1/lib/d/newbie/newken/
final_realms_fluffos_v1/lib/d/newbie/newken/chars/
final_realms_fluffos_v1/lib/d/newbie/newken/misc/
final_realms_fluffos_v1/lib/d/newbie/newken/npcs/
final_realms_fluffos_v1/lib/d/newbie/newken/obj/
final_realms_fluffos_v1/lib/d/newbie/newliz/
final_realms_fluffos_v1/lib/d/newbie/newliz/cave/
final_realms_fluffos_v1/lib/d/newbie/newliz/npcs/
final_realms_fluffos_v1/lib/d/newbie/orc/items/misc/
final_realms_fluffos_v1/lib/d/newbie/orc/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/orc/tower/
final_realms_fluffos_v1/lib/d/vehicle/
final_realms_fluffos_v1/lib/doc/
final_realms_fluffos_v1/lib/doc/driver/
final_realms_fluffos_v1/lib/doc/driver/concepts/
final_realms_fluffos_v1/lib/doc/driver/driver/
final_realms_fluffos_v1/lib/doc/driver/efuns/arrays/
final_realms_fluffos_v1/lib/doc/driver/efuns/bitstrings/
final_realms_fluffos_v1/lib/doc/driver/efuns/communication/
final_realms_fluffos_v1/lib/doc/driver/efuns/core/
final_realms_fluffos_v1/lib/doc/driver/efuns/debugging/
final_realms_fluffos_v1/lib/doc/driver/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/driver/efuns/interactive/
final_realms_fluffos_v1/lib/doc/driver/efuns/mappings/
final_realms_fluffos_v1/lib/doc/driver/efuns/objects/
final_realms_fluffos_v1/lib/doc/driver/efuns/security/
final_realms_fluffos_v1/lib/doc/driver/efuns/strings/
final_realms_fluffos_v1/lib/doc/driver/efuns/system/
final_realms_fluffos_v1/lib/doc/driver/efuns/types/
final_realms_fluffos_v1/lib/doc/driver/lpc/constructs/
final_realms_fluffos_v1/lib/doc/driver/lpc/types/
final_realms_fluffos_v1/lib/doc/driver/platforms/
final_realms_fluffos_v1/lib/doc/lpc/
final_realms_fluffos_v1/lib/doc/mail/
final_realms_fluffos_v1/lib/doc/man/
final_realms_fluffos_v1/lib/doc/man/html/
final_realms_fluffos_v1/lib/doc/man/html/applies/
final_realms_fluffos_v1/lib/doc/man/html/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/html/driver/
final_realms_fluffos_v1/lib/doc/man/html/efuns/
final_realms_fluffos_v1/lib/doc/man/html/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/html/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/html/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/html/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/html/efuns/general/
final_realms_fluffos_v1/lib/doc/man/html/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/
final_realms_fluffos_v1/lib/doc/man/local/applies/
final_realms_fluffos_v1/lib/doc/man/local/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/local/applies/master/
final_realms_fluffos_v1/lib/doc/man/local/concepts/
final_realms_fluffos_v1/lib/doc/man/local/defines/
final_realms_fluffos_v1/lib/doc/man/local/driver/
final_realms_fluffos_v1/lib/doc/man/local/efuns/
final_realms_fluffos_v1/lib/doc/man/local/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/local/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/local/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/local/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/local/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/local/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/local/efuns/general/
final_realms_fluffos_v1/lib/doc/man/local/efuns/interactive/
final_realms_fluffos_v1/lib/doc/man/local/efuns/internals/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/local/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/objects/
final_realms_fluffos_v1/lib/doc/man/local/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/efuns/sockets/
final_realms_fluffos_v1/lib/doc/man/local/efuns/strings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/system/
final_realms_fluffos_v1/lib/doc/man/local/historical/
final_realms_fluffos_v1/lib/doc/man/local/lfun/QC/
final_realms_fluffos_v1/lib/doc/man/local/lfun/events/
final_realms_fluffos_v1/lib/doc/man/local/lfun/monster/
final_realms_fluffos_v1/lib/doc/man/local/lfun/properties/
final_realms_fluffos_v1/lib/doc/man/local/lpc/
final_realms_fluffos_v1/lib/doc/man/local/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/local/lpc/types/
final_realms_fluffos_v1/lib/doc/man/local/standards/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/basic/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/intermediate/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/concepts/
final_realms_fluffos_v1/lib/doc/man/mudos/driver/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/general/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mixed/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/types/
final_realms_fluffos_v1/lib/doc/races/
final_realms_fluffos_v1/lib/doc/races/old_race/
final_realms_fluffos_v1/lib/global/virtual/
final_realms_fluffos_v1/lib/global/wiz_backup/
final_realms_fluffos_v1/lib/net/config/
final_realms_fluffos_v1/lib/net/daemon/chars/
final_realms_fluffos_v1/lib/net/inherit/
final_realms_fluffos_v1/lib/net/intermud3/
final_realms_fluffos_v1/lib/net/intermud3/cmds/
final_realms_fluffos_v1/lib/net/intermud3/save/
final_realms_fluffos_v1/lib/net/intermud3/services/
final_realms_fluffos_v1/lib/net/obj/
final_realms_fluffos_v1/lib/net/old/
final_realms_fluffos_v1/lib/net/old/intermud/
final_realms_fluffos_v1/lib/net/old/intermud/adm/
final_realms_fluffos_v1/lib/net/old/intermud/services/
final_realms_fluffos_v1/lib/net/old/intermud/udp/
final_realms_fluffos_v1/lib/net/virtual/
final_realms_fluffos_v1/lib/obj/b_day/
final_realms_fluffos_v1/lib/obj/chars/
final_realms_fluffos_v1/lib/obj/handlers/lists/
final_realms_fluffos_v1/lib/obj/handlers/useless/
final_realms_fluffos_v1/lib/obj/monsters/
final_realms_fluffos_v1/lib/obj/roomgen/
final_realms_fluffos_v1/lib/obj/soul/
final_realms_fluffos_v1/lib/obj/vegetation/
final_realms_fluffos_v1/lib/obj/weapons/oldsys/
final_realms_fluffos_v1/lib/open/
final_realms_fluffos_v1/lib/players/g/
final_realms_fluffos_v1/lib/releasefiles/d/heaven/
final_realms_fluffos_v1/lib/releasefiles/d/mudlib/
final_realms_fluffos_v1/lib/releasefiles/d/newbie/
final_realms_fluffos_v1/lib/releasefiles/doc/
final_realms_fluffos_v1/lib/releasefiles/players/g/
final_realms_fluffos_v1/lib/releasefiles/save/
final_realms_fluffos_v1/lib/releasefiles/save/environ/
final_realms_fluffos_v1/lib/releasefiles/save/roomgen/
final_realms_fluffos_v1/lib/releasefiles/secure/
final_realms_fluffos_v1/lib/releasefiles/w/
final_realms_fluffos_v1/lib/releasefiles/w/god/
final_realms_fluffos_v1/lib/room/
final_realms_fluffos_v1/lib/save/
final_realms_fluffos_v1/lib/save/environ/
final_realms_fluffos_v1/lib/save/roomgen/
final_realms_fluffos_v1/lib/scripts/
final_realms_fluffos_v1/lib/secure/crerem/
final_realms_fluffos_v1/lib/secure/dom/
final_realms_fluffos_v1/lib/secure/log/
final_realms_fluffos_v1/lib/secure/misc/
final_realms_fluffos_v1/lib/std/adnd/
final_realms_fluffos_v1/lib/std/commands/shadows/
final_realms_fluffos_v1/lib/std/creator/
final_realms_fluffos_v1/lib/std/curses/
final_realms_fluffos_v1/lib/std/curses/old_sys/
final_realms_fluffos_v1/lib/std/curses/shadows/
final_realms_fluffos_v1/lib/std/dom/
final_realms_fluffos_v1/lib/std/effects/
final_realms_fluffos_v1/lib/std/effects/healing/
final_realms_fluffos_v1/lib/std/effects/other/
final_realms_fluffos_v1/lib/std/effects/poisons/
final_realms_fluffos_v1/lib/std/environ/
final_realms_fluffos_v1/lib/std/guilds/
final_realms_fluffos_v1/lib/std/guilds/priests/samples/
final_realms_fluffos_v1/lib/std/guilds/wizards/
final_realms_fluffos_v1/lib/std/living/baldy/
final_realms_fluffos_v1/lib/std/living/divstuff/
final_realms_fluffos_v1/lib/std/paran/
final_realms_fluffos_v1/lib/std/poisons/
final_realms_fluffos_v1/lib/std/poisons/shadows/
final_realms_fluffos_v1/lib/std/poisons/weapons/
final_realms_fluffos_v1/lib/std/race_groups/
final_realms_fluffos_v1/lib/std/room/
final_realms_fluffos_v1/lib/std/room/old/
final_realms_fluffos_v1/lib/std/rooms/
final_realms_fluffos_v1/lib/std/shadows/
final_realms_fluffos_v1/lib/std/shadows/test_shad/
final_realms_fluffos_v1/lib/std/socket/
final_realms_fluffos_v1/lib/std/spells/
final_realms_fluffos_v1/lib/std/vaults/
final_realms_fluffos_v1/lib/tmp/
final_realms_fluffos_v1/lib/w/
final_realms_fluffos_v1/lib/w/god/
final_realms_fluffos_v1/old/
final_realms_fluffos_v1/win32/
// std/room/door.c

// This object is unusual -- it affects the inventory of two objects (rooms).
// Currently, that is handled by having two nearly identical objects.
// The creation and destruction require careful handling.
// When open, it must be open on both sides.
// However, may be locked from only one side. (maybe???)

// Isthar@Aurora 16-Jun 1994, added stuff for invis players
// 1995 Jul 20 Laggard      removed defines now in room.h.
// 1995 Jul 27 Laggard      extensive revision to stop forcing room loads.

#include "parse_command.h"
#include "room.h"
#include "door.h"

// debugging logs
#define DOOR_BUG_LOG "room_doors.bug"
#define ROOM_BUG_LOG "room_bugs.log"
// protected variables:

private string
        my_long,
        my_short,
        *my_adjectives,
        *my_plurals,
        *my_names,
        key_prop;

private mixed
        *unlock_func,
        *open_func,
        *picked;

    // file_names instead of objects allows reload when rooms clean_up.
private string room_one;    // the creating room_file_name
private string exit_one;    // the creating exit_name

private string room_two;    // the other room_file_name (set when valid)
private string exit_two;    // the other exit_name (set by other room)

private string exit_type = "door";

private int
        locked,
        diff,
        open;


int do_unlock(object *obs);

void create() {
  my_adjectives = ({ });
  my_plurals = ({ "doors" });
  my_names = ({ "door" });
  key_prop = "generic_key";
  my_long = "";
}

void set_key_prop(string p) { key_prop = p; }
string query_key_prop() { return key_prop; }

void set_difficulty(int i) { diff = i; }
int query_difficulty() { return diff; }

void set_other_id(string s) { exit_two = s; }
string query_other_id() { return exit_two; }

void set_open_func(mixed *bing) { open_func = bing; }
mixed *query_open_func() { return open_func; }

void set_unlock_func(mixed *bing) { unlock_func = bing; }
mixed *query_unlock_func() { return unlock_func; }

void set_locked(int i) { locked = i; }
int query_locked() { return locked; }

void set_open(int i) { open = i; }
int query_open() { return open; }

void init() {
  this_player()->add_command("open", this_object(), "%D");
  this_player()->add_command("close", this_object(), "%D");
  this_player()->add_command("lock", this_object(), "%D %p %I");
  this_player()->add_command("unlock", this_object(), "%D %p %I");
}

string short() {
  return my_short;
}

string pretty_short() { return short(); }

string query_plural() { return pluralize(my_short); }
string pretty_plural() { return query_plural(); }

string long() {
  string ret;

  if (open)
    ret = "The " + my_short + " is open.\n";
  else {
    ret = "The " + my_short + " is closed.\n";
    if (locked)
      ret += "The " + my_short + " is locked.\n";
  }
  return my_long+ret;
}

void set_long(string s) { my_long = s; }
string query_long() { return my_long; }

string query_short() { return my_short; }
void set_short(string str) { 
  string *bits;

  bits = explode(str, " ");
  my_adjectives += bits[0..sizeof(bits)-2];
  my_names += ({ bits[sizeof(bits)-1] });
  my_short = str;
}

int drop() { return 1; }
int get() { return 1; }


// returns the values needed for setup {Laggard}
mixed query_door_values()
{
    return ({ open, locked, key_prop, diff, exit_one, });
}


// called immediately after door is cloned
void setup_door(
    string directive,
    object this_side,
    mixed other_side,
    mixed *values,
    string kind )
{
  string *bits, s;

    exit_one = directive;
    room_one = file_name(this_side);

    if ( stringp(other_side) )
    {
        room_two = other_side;
    }
    else if ( objectp(other_side) )
    {
        room_two = file_name(other_side);
    }
    else
    {
        log_file( ROOM_BUG_LOG, ctime(time())
            +" invalid door setup: " + other_side
            +", [" + directive
            +"] "
            + file_name(this_side)
            +"\n");
    }

    if ( kind )
    {
        exit_type = kind;
    }

  if (directive[0..5] == "enter ")
    my_short = directive[6..1000] +" " + exit_type;
  else
    my_short = directive + " " + exit_type;

  my_names = ({ });
  my_plurals = ({ });

  bits = explode(my_short, " ");
  my_names += ({ (s=bits[sizeof(bits)-1]) });
  my_plurals += ({ pluralize(s) });
  my_adjectives += bits;

  open = values[D_OPEN];
  locked = values[D_LOCKED];
  diff = values[D_DIFFICULTY];
  key_prop = values[D_KEY];
  exit_two = values[D_OTHER];
  picked = ({ });
}

void add_alias(string nam) {
  string *bits, s;

  bits = explode(nam, " ");
  my_names += ({ (s=bits[sizeof(bits)-1]) });
  my_plurals += ({ pluralize(s) });
  my_adjectives += bits;
}

int do_close() {
  if (!open)
    return 0;
  if (open_func) {
    if (!call_other(open_func[0], open_func[1], 0))
      return 0;
  }

  /* Ok...  now close it... */
  room_one->modify_exit(exit_one, ({ "open", 0 }));

  if (exit_two)
  {
    room_two->modify_exit(exit_two, ({ "open", 0 }));
    room_two->tell_door(exit_two, "The %D closed.\n");
  }
  return 1;
}

int do_open() {
  if (open)
    return 0;
  if (locked)
    if (!do_unlock(all_inventory(this_player())))
      return 0;
  if (open_func) {
    if (!call_other(open_func[0], open_func[1], 1))
      return 0;
  }

  /* Ok...  now open it... */
  room_one->modify_exit(exit_one, ({ "open", 1 }));

  if (exit_two)
  {
    room_two->modify_exit(exit_two, ({ "open", 1 }));
    room_two->tell_door(exit_two, "The %D opened.\n");
  }
  return 1;
}

int test_key(object ob) {
  return (int)ob->query_property(key_prop);
}

int do_lock(object *obs) {
  int ret;

  if (open)
    return 0;
  if (locked)
    return 0;
  if (unlock_func) {
    if (!(ret = call_other(unlock_func[0], unlock_func[1], 0)))
      return 0;
  }
  if (ret != 2)
    if (!sizeof(obs = filter_array(obs, "test_key", this_object())))
      return 0;

  /* Ok...  now lock it... */
  room_one->modify_exit(exit_one, ({ "locked", 1 }));

  if (exit_two)
  {
    room_two->modify_exit(exit_two, ({ "locked", 1 }));
    room_two->tell_door(exit_two, "The %D clicked.\n");
  }
  this_player()->add_succeeded(obs[0]);
  return 1;
}

int do_unlock(object *obs) {
  int ret;

  notify_fail("You cannot unlock the " + exit_type + ".\n");
  if (!locked)
    return 0;
  if (unlock_func) {
    if (!(ret = call_other(unlock_func[0], unlock_func[1], 1)))
      return 0;
  }
  if (ret != 2)
    if (!sizeof(obs = filter_array(obs, "test_key", this_object())))
      return 0;

  /* Ok...  now unlock it... */
  room_one->modify_exit(exit_one, ({ "locked", 0 }));

  if (exit_two)
  {
    room_two->modify_exit(exit_two, ({ "locked", 0 }));
    room_two->tell_door(exit_two, "The %D clicked.\n");
  }
  this_player()->add_succeeded(obs[0]);
  return 1;
}

int query_key() {
  if (key_prop != "generic_key")
    return 1;
  return 0;
}

void pick_lock(mixed pc) {
  picked += ({ ({ pc, 1 }) });
  set_locked(1);
}

void pick_unlock(mixed pc) {
  picked += ({ ({ pc, 0 }) });
  set_locked(0);
}  

string *parse_command_id_list() { return my_names; }
string *parse_command_plural_id_list() { return my_plurals; }
string *parse_command_adjectiv_id_list() { return my_adjectives; }

object query_parse_id(mixed *arr) {
  string *bits;
  mixed stuff;
  int i;

  if (arr[P_THING] == 0) {
    bits = explode(arr[P_STR], " ");
    return this_object();
  }
  if (arr[P_THING] < 0) { /* specific object case */
    arr[P_THING]++;
    if (arr[P_THING] != 0)
      return 0;
    arr[P_THING] = -10321;
    return this_object();
  }
  arr[P_THING]--; /* lots of objects case */
  if (arr[P_THING] != 0)
    return this_object();
  arr[P_THING] = -10786;
  return this_object();
}

void dest_me() {
  destruct(this_object());
  return ;
}

void dwep() {
  destruct(this_object());
  return ;
}

int move() { return 1; }


int moveing_close(object who)
{
  string oshrt;

  if (!exit_two)
  {
    // no door on other side, or move_player failed.
#ifdef DOOR_BUG_LOG
    if ( exit_type != "portal" )
    {
      log_file( DOOR_BUG_LOG, ctime(time())
            +" return door missing in "
            + room_two
            + " [" + exit_one
            + "] " + room_one
            +"\n");
    }
#endif
    return 0;
  }
  if (!room_two->call_door(exit_two, "do_close"))
    return 0;

  oshrt = (string)room_two->call_door(exit_two, "query_short");
  tell_object(who, "You close the "+oshrt+".\n");
// Isthar@Aurora 16-Jun 1994, keep hidden invis people
// Laggard@RotD not that hidden!
  if (who->query_invis() == 0)
  {
    tell_room(find_object(room_two), who->query_cap_name()+" closed the "+oshrt+".\n", ({who}));
  }
  else
  {
    tell_room(find_object(room_two), "The "+oshrt+" closed.\n", ({who}));
  }
  return 1;
}


int moveing_open(object who)
{
  if (!do_open())
    return 0;
  tell_object(who, "You open the "+my_short+".\n");
// Isthar@Aurora 16-Jun 1994, keep hidden invis people
  if (who->query_invis() == 0)
  {
    tell_room(find_object(room_one), who->query_cap_name()+" opened the "+my_short+".\n",({who}));
  }
  else
  {
    tell_room(find_object(room_one), "The "+my_short+" opened.\n", ({who}));
  }
  return 1;
}


int moveing_lock(object who)
{
  string oshrt;

  if (!exit_two)
  {
    // no door on other side, or move_player failed.
#ifdef DOOR_BUG_LOG
    if ( exit_type != "portal" )
    {
      log_file( DOOR_BUG_LOG, ctime(time())
            +" return door missing in "
            + room_two
            + " [" + exit_one
            + "] " + room_one
            +"\n");
    }
#endif
    return 0;
  }
  if (!room_two->call_door(exit_two, "do_lock", all_inventory(who)))
    return 0;

  oshrt = (string)room_two->call_door(exit_two, "query_short");
  tell_object(who, "You lock the "+oshrt+".\n");
// Isthar@Aurora 16-Jun 1994, keep hidden invis people
// Laggard@RotD not that hidden!
  if (who->query_invis() == 0)
  {
    tell_room(find_object(room_two), who->query_cap_name()+" locked the "+oshrt+".\n", ({who}));
  }
  else
  {
    tell_room(find_object(room_two), "The "+oshrt+" clicked.\n", ({who}));
  }
  return 1;
}


int moveing_unlock(object who)
{
  if (!do_unlock(all_inventory(who)))
    return 0;
  tell_object(who, "You unlock the "+my_short+".\n");
// Isthar@Aurora 16-Jun 1994, keep hidden invis people
  if (who->query_invis() == 0)
  {
    tell_room(find_object(room_one), who->query_cap_name()+" unlocked the "+my_short+".\n",({who}));
  }
  else
  {
    tell_room(find_object(room_one), "The "+my_short+" clicked.\n", ({who}));
  }
  return 1;
}


void tell_door(string str)
{
    // Laggard@RotD removed the names from the messages,
    // since this_player() isn't in the room anyway....
    tell_room(find_object(room_one), replace(str, "%D", my_short), ({ this_player() }));
}