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/
#include <type.h>

inherit obje OBJECT;
inherit cont CONTAINER;
inherit M_FAKE_OBJECT;

static mapping exits;
static mapping hidden_exits;
static string  area;
static int last_exit;

void setup( void );

void create( void ) {
  obje::create();
  cont::create();
  add_event( "body_enter" );
  add_event( "body_leave" );
  add_event( "body_look" );
  add_event( "body_look_at" );
  add_event( "room_message" );
  EVENT_D->subscribe_event( "clean_up" );
  exits = ([]);
  hidden_exits = ([]);
  last_exit = 0;
  setup();
}

void set_area( string str ) {
  area = str;
}

string query_area( void ) {
  return area;
}

void set_exits( mapping ex ) {
  exits = ex;
}

void set_hidden_exits( mapping ex ) {
  hidden_exits = ex;
}

void add_exit( string direction, string file ) {
  exits += ([ direction : file ]);
}

void add_hidden_exit( string direction, string file ) {
  hidden_exits += ([ direction : file ]);
}

void set_exit_msg( string ext, string msg ) {

}

mapping query_exits( void ) {
  return(exits);
}              

mapping query_hidden_exits( void ) {
  return(hidden_exits);
}              

string *query_exit_indices( void ) {
  return( map_indices( exits ) );
}

string *query_hidden_exit_indices( void ) {
  return( map_indices( hidden_exits ) );
}

string query_exit( string direction ) {
  return( exits[direction] );
}

string query_hidden_exit( string direction ) {
  return( hidden_exits[direction] );
}

string query_desc( int brief ) {
  string text;
  int i;

  text = query_brief();

  text += " %^CYAN%^[ exits: ";

  if( !exits || map_sizeof( exits ) == 0 ) {
    text += "none ";
  } else {
    for( i = 0; i < map_sizeof( exits ); i++ ) {
      text += map_indices(exits)[i] + " ";
    }
  }

  text += "]%^RESET%^\n";

  text += query_long();

  text += "\n";

  if( inventory && sizeof( inventory ) > 1 ) {
    /* There is something in the room */

    text += "\nYou see:\n";

    for( i = 0; i < sizeof( inventory ); i++ ) {
      if( !inventory[i]->is_living() ) {
	if( inventory[i]->query_brief() == 0 
	    || inventory[i]->query_brief() == "" ) {
	  if( inventory[i]->query_adj() == 0 
	      || inventory[i]->query_adj() == "" ) {
	    text += "  " + article( inventory[i]->query_id() ) + " " + inventory[i]->query_id() + "\n";
	  } else {
	    text += "  " + article( inventory[i]->query_adj() ) + " " + inventory[i]->query_adj() + " " + inventory[i]->query_id() + "\n";
	  }
	} else {
	  text += "  " + inventory[i]->query_brief() + "\n";
	}
      }
    }

    for( i = 0; i < sizeof( inventory ); i++ ) {
      if( inventory[i]->is_living() ) {
        if( inventory[i] == this_player() )
          continue;
        if( inventory[i]->query_idle() > 60 ) {
          text += "  " + inventory[i]->query_brief() 
                  + " [idle" + format_idle_time( inventory[i]->query_idle() ) + "]\n";
        } else {
          text += "  " + inventory[i]->query_brief() + "\n";
        }
      }
    }
  }
  return( text );
}

varargs void tell_room( object originator, string str, mixed obj...) {
  int i;
  
  if( !inventory && sizeof( inventory ) > 0 ) {
    return;
  }
  for( i = 0; i < sizeof( inventory ); i++ ) {
    if( inventory[i] == 0 )
      continue;
    if( originator != inventory[i] && member_array(inventory[i], obj ) == -1 ) {
      if( inventory[i]->is_living() ) {
        inventory[i]->message( capitalize( str ) );
      }
      inventory[i]->outside_message( capitalize( str ) );
    }
  }
}

string body_exit( object who, string dir ) {
  int i;
  string error;
  
  if( !query_exit( dir ) && !query_hidden_exit( dir ) ) {
    write( "You can't go " + dir + ".\n" );
    return( 0 );
  } 
  
  /* there is a normal exit */
  if( query_exit( dir ) ) {
    /* Is there a fake exit? */
    if( query_exit( dir )[0] == '#' ) {
      return( query_exit( dir )[1..] );
    }
    for( i = 0; i < sizeof( inventory ); i++ ) {
      if( inventory[i]->is_blocking( dir ) ) {
	      /* We've got an object blocking the exit! */
        if( inventory[i]->do_block( who ) == 0 ) {
	        inventory[i]->other_action( inventory[i], inventory[i]->query_block_action(), who, dir );
	        return( 0 );
	      }
      }
    }
    event( "body_leave", who );
    tell_room( who, capitalize( who->query_id() ) + " leaves " + dir + ".\n" );
    error = catch( who->move( query_exit( dir ) ) );
    last_exit = time();
  } else if( query_hidden_exit( dir ) ) {
    /* there is a hidden exit */
    if( query_hidden_exit( dir )[0] == '#' ) {
      return( query_hidden_exit( dir )[1..] );
    }
    for( i = 0; i < sizeof( inventory ); i++ ) {
      if( inventory[i]->is_blocking( dir ) ) {
    	/* We've got a monster blocking the exit! */
      	if( inventory[i]->do_block( who ) != 0 ) {
	        inventory[i]->other_action( inventory[i], inventory[i]->query_block_action(), who, dir );
	        return( 0 );
	      }
      }
    }
    event( "body_leave", who );
    tell_room( who, capitalize( who->query_id() ) + " leaves " + dir + ".\n" );
    error = catch( who->move( query_hidden_exit( dir ) ) );
    last_exit = time();
  }
  
  
  if( error ) {
    if( SECURE_D->query_wiz( who->query_id() ) == 1 )
      return( "\nConstruction blocks your path.\n" + "Error: " + error);
    else
      return( "\nConstruction blocks your path.\n" );
  }
  
  if( who->is_player() || who->is_possessed() ) {
     mixed desc;
     desc = PARSE_D->parse( "look" );
     if( typeof( desc ) == T_STRING ) {
	write( desc );
     }
  }
  event( "body_enter", who );
  who->query_environment()->tell_room( who, capitalize( who->query_id() ) + " enters.\n" );
  return( 0 );
}

void destruct( void ) {
  int i;
  for( i = 0; i < sizeof( inventory ); i++ ) {
    inventory[i]->destruct();
  }
  EVENT_D->unsubscribe_event( "clean_up" );
  destruct_object( this_object() );
}

void event_clean_up( void ) {
  int i;

  inventory -= ({ 0 });

  if( time() - last_exit < 60 * 15 ) 
     return;

  for( i = 0; i < sizeof( inventory ); i++ ) {
    if( inventory[i] == 0 )
      continue;
    if( inventory[i]->is_player() || inventory[i]->is_possessed() )
      return;
  }

  destruct();
}