gurba-0.40/
gurba-0.40/bin/
gurba-0.40/lib/
gurba-0.40/lib/cmds/guild/fighter/
gurba-0.40/lib/cmds/monster/
gurba-0.40/lib/cmds/race/catfolk/
gurba-0.40/lib/cmds/race/dwarf/
gurba-0.40/lib/cmds/verb/
gurba-0.40/lib/daemons/data/
gurba-0.40/lib/data/boards/
gurba-0.40/lib/data/messages/
gurba-0.40/lib/data/players/
gurba-0.40/lib/design/
gurba-0.40/lib/domains/gurba/
gurba-0.40/lib/domains/gurba/guilds/fighter/
gurba-0.40/lib/domains/gurba/monsters/
gurba-0.40/lib/domains/gurba/objects/armor/
gurba-0.40/lib/domains/gurba/objects/clothing/
gurba-0.40/lib/domains/gurba/objects/weapons/
gurba-0.40/lib/domains/gurba/vendors/
gurba-0.40/lib/kernel/cmds/admin/
gurba-0.40/lib/kernel/daemons/
gurba-0.40/lib/kernel/include/
gurba-0.40/lib/kernel/lib/
gurba-0.40/lib/kernel/net/
gurba-0.40/lib/kernel/sys/
gurba-0.40/lib/logs/
gurba-0.40/lib/pub/
gurba-0.40/lib/std/modules/languages/
gurba-0.40/lib/std/races/
gurba-0.40/lib/std/races/monsters/
gurba-0.40/lib/wiz/fudge/
gurba-0.40/lib/wiz/spud/
gurba-0.40/src/host/beos/
gurba-0.40/src/host/pc/res/
gurba-0.40/src/kfun/
gurba-0.40/src/lpc/
gurba-0.40/src/parser/
gurba-0.40/tmp/
/* Created by Fudge */

inherit OBJECT;
inherit M_GETTABLE;
inherit M_OPENABLE;
inherit M_MESSAGES;
inherit M_BLOCKEXITS;

static string our_exit;
static string our_identity;
static string sibling_room;
static object sibling;

void create( void ) {
  ::create( );
  set_id( "door" );
  set_long( "Your average wooden door." );
  set_in_room_desc( "A wooden door" );
  set_gettable( 0 );
  set_open_state( 0 );
}

int is_door( void ) {
  return( 1 );
}

string query_door_exit( void ) {
  return( our_exit );
}

void refresh_sibling( void ) {
  object *obs;
  int i;

  if( sibling == 0 ) {
    /* We've lost the cached sibling. Find it again. */
    sibling_room = this_object()->query_environment()->query_exit( our_exit );
    obs = sibling_room->query_inventory();
    if( obs != 0 ) {
      for( i = 0; i < sizeof( obs ); i++ ) { 
        if( obs[i]->query_door_identity() == our_identity 
	    && obs[i]->query_door_exit() == invert_exit( our_exit ) ) {
          sibling = obs[i];
        }
      }
    }
  }
}

void update_sibling( void ) {
  
  if( sibling == 0 )
    refresh_sibling();

  if( this_object()->query_open_state() == 1 )
    sibling->do_open( 0 );

  if( sibling != 0 ) {
    if( sibling->query_open_state() == 1 ) {
      /* We need to update this doors state */
      this_object()->do_open( 0 );
    }
  }
}

void do_on_open( object who ) {
  if( sibling == 0 )
    refresh_sibling();

  if( sibling != 0 ) {
    if( sibling->query_open_state() == 1 )
      return;
    sibling->set_open_state( 1 );
  }
}

void do_on_close( object who ) {
  if( sibling == 0 )
    refresh_sibling();

  if( sibling != 0 ) {
    if(sibling->query_open_state() == 0 ) 
      return;
    sibling->set_open_state( 0 );
  }
}

int do_block( object who ) {
  if( this_object()->query_open_state() == 0 )
    return( 0 );
  return( 1 );
}

void mudlib_setup( mixed *args ) {

  if( sizeof( args ) != 2 ) {
    return;
  }

  add_adj( args[0] );

  our_exit = args[0];
  our_identity = args[1];
  update_sibling();
  add_block( our_exit );
  set_open_description( query_open_description() + " %^CYAN%^[" + our_exit + "]%^RESET%^" );
  set_closed_description( query_closed_description() + " %^CYAN%^[" + our_exit + "]%^RESET%^" );
  update_description();
}

string query_door_identity( void ) {
  return( our_identity );
}

void set_door_identity( string ident ) {
  our_identity = ident;
}