area_current/castle/
area_current/gahld/
clans/
player/
player/c/
  /*  Creates random maze and returns the vnum of farthest room from start */
int find_reverse( int, int, int );
int find_random( int, int, int );
int which_door( int, int );

CHAR_DATA *user;
int starting_room, size_x, size_y, size_z;
int last_door;

int mazegen( CHAR_DATA *ch, int start_room, int x_size, int y_size, int z_size, int seed)
  {
  int total_rooms, room_count, farthest_room, old_farthest;
  int x, y, z, door, dest, room;

  starting_room = start_room;

  if( x_size<1)
    x_size=1;
  if( y_size<1)
    y_size=1;
  if( z_size<1)
    z_size=1;
  total_rooms = x_size* y_size* z_size;
  size_x=x_size;
  size_y=y_size;
  size_z=z_size;
  old_farthest=0;
  farthest_room=starting_room;
  room_count=0;
  user=ch;

  for( room=starting_room; room< total_rooms + starting_room; room++)
    for( door=0; door<6; door++)
      set_exit( room, door, -1);
  room=starting_room;
  srand( seed );

  while( TRUE )
    {
    x=(room-starting_room)%size_x;
    y=((room-starting_room)/size_x)%size_y;
    z=(room-starting_room)/size_x/size_y;
    
    if( (dest=find_random( x, y, z)) >=0 )
      {
      set_exit( room, last_door, dest);
      room=dest;
      room_count++;
      }
    else
      if( (dest=find_reverse( x, y, z)) >=0 )
        {
        set_exit( room, last_door, dest);
        room=dest;
        room_count--;
        }
      else
        return( farthest_room);
    if( room_count > old_farthest )
      {
      farthest_room = room;
      old_farthest = room_count;
      }
      
    }
    return( farthest_room);

    
  }
  
int reverse( int in )
  {
  switch( in )
    {
    case 0: return (2);break;
    case 1: return (3);break;
    case 2: return (0);break;
    case 3: return (1);break;
    case 4: return (5);break;
    case 5: return (4);break;
    }
  return(-1);
  }

bool is_exit( int room, int door)
  {
	EXIT_DATA *pexit;
  if( room_index[room]==NULL)
    {
    log_string( "bad room.");
    return( FALSE);
    }
	pexit = room_index[room]->exit[door];
  if( pexit == NULL )
    return( FALSE );
	return( TRUE );
  }

void set_exit( int room, int door, int dest)
  {
    
	EXIT_DATA *pexit;
  if( room<1 || dest<-1 || room_index[ room ] == NULL || door<0 || door>5
           || ( dest != -1 && room_index[dest]==NULL))
    {
    char buf[200];
    sprintf( buf, "Bad room connect at %d door %d to %d", room, door, dest );
    log_string( buf );
    return;
    }

  pexit = room_index[ room ]->exit[door];
  if( pexit==NULL && dest>0)
    {
    CREATE(pexit, EXIT_DATA, 1);
    pexit->description	= STRALLOC("");
    pexit->keyword        = STRALLOC("");
    pexit->pvnum  = -1;
    pexit->key		= -1;
    pexit->vnum		= room;
    room_index[ room ]->exit[door]= pexit;
    top_exit++;
    }
  if( dest>0 )
    {
    pexit->exit_info=0;
    pexit->to_room = room_index[ dest ];
    }
  else
    {
    if( pexit==NULL)
      return;
    if (pexit->keyword != NULL )
      STRFREE (pexit->keyword );
    STRFREE (pexit->description );
    DISPOSE( pexit );
    room_index[ room ]->exit[door]=NULL;
    top_exit--;
    }
  return;
  }

int get_room( int x, int y, int z)
  {
  return( starting_room + x + ( y * size_x ) + ( z * size_x * size_y ) );
  }

int find_reverse( int x, int y, int z )
  {
  int door, dx, dy, dz;
  int room, dest;
  room= get_room( x, y, z);
  for( door=0; door<6; door++)
    if( !is_exit( room , door ))
      {
      dx=x;
      dy=y;
      dz=z;
      switch( door )
        {
        case 0: if( dy< size_y-1) dy++;break;
        case 1: if( dx< size_x-1) dx++;break;
        case 2: if( dy> 0) dy--;break;
        case 3: if( dx> 0) dx--;break;
        case 4: if( dz< size_z-1) dz++;break;
        case 5: if( dz> 0) dz--;break;
        }
      dest= get_room( dx, dy, dz);
      if( (x!=dx || y!=dy || z!=dz) && 
          is_exit( dest , reverse( door ) ) )
        {
        last_door=door;
        return( dest);
        }
      }
    return( -1 );
    }
        
      
int find_random( int x, int y, int z )
  {
  int door, dx, dy, dz;
  int start, direction , dest, room;
  bool found;

  found = FALSE;

  start=rand()%5;
  direction=(2*(rand()%2))-1;
  door=start;
  room = get_room( x, y, z);

  while( door!=start || !found )
    {
    found=TRUE;
    
    if( !is_exit( room, door ))
      {
      dx=x;
      dy=y;
      dz=z;
      switch( door )
        {
        case 0: if( dy< size_y-1) dy++;break;
        case 1: if( dx< size_x-1) dx++;break;
        case 2: if( dy> 0) dy--;break;
        case 3: if( dx> 0) dx--;break;
        case 4: if( dz< size_z-1) dz++;break;
        case 5: if( dz> 0) dz--;break;
        }
      if( (x!=dx || y!=dy || z!=dz) )
        {
        int tdoor;
        bool found;
        found=FALSE;
        dest= get_room( dx, dy, dz);
        for( tdoor=0; tdoor<6; tdoor++)
          if( is_exit( dest , tdoor ) )
            found=TRUE;
        if( !found)
          {
          last_door=door;
          return( dest);
          }
        }
      }
    door+=direction;
    if( door > 5 )
      door=0;
    if( door < 0 )
      door=5;
    }
  return( -1 );
  } 
      
int which_door( int room, int dest)
  {
	EXIT_DATA *pexit;
  int door;

  for( door=0; door<6; door++)
    {
	  pexit = room_index[ room ]->exit[door];
    if( pexit!=NULL)
      if( pexit->to_room->vnum == dest )
        return( door );
    }
  return( -1 );
  }