tfe-1.0/area/
tfe-1.0/files/
tfe-1.0/logs/
tfe-1.0/logs/immortal/
tfe-1.0/logs/mob/
tfe-1.0/logs/object/
tfe-1.0/logs/player/
tfe-1.0/logs/room/
tfe-1.0/notes/clans/
tfe-1.0/player/
tfe-1.0/prev/
tfe-1.0/prev/area/
tfe-1.0/prev/player/
tfe-1.0/prev/rooms/
tfe-1.0/rooms/
tfe-1.0/src-gc/
tfe-1.0/src-msvc/
tfe-1.0/src-unix/
tfe-1.0/www/
tfe-1.0/www/html/
/*
 *
 */


void  fsend         ( char_data*, const char* );  
void  fpage         ( char_data*, const char* );  

extern const char*   scroll_line     [ 3 ];


/*
 *   ACT ROUTINES
 */


#define cc const char
#define cd char_data
#define od obj_data
#define vd visible_data

void  act_print     ( char*, cc*, vd*, vd*, vd*, vd*, cc*, cc*, cd* );

void  act           ( cd*, cc*, vd*, vd* = NULL, vd* = NULL, vd* = NULL );
void  act           ( cd*, cc*, vd*, vd*, cc*, cc* = NULL ); 
void  act_notchar   ( cc*, cd*, vd* = NULL, vd* = NULL );
void  act_notchar   ( cc*, cd*, cc*, cc* );
void  act_notchar   ( cc*, cd*, vd*, cc*, cc* );
void  act_room      ( room_data*, cc*, cc* = NULL, cc* = NULL );
void  act_room      ( room_data*, cc*, vd*, vd* = NULL );
void  act_area      ( cc*, cd*, cd*, vd* );
void  act_neither   ( cc*, cd*, cd*, vd*, vd* = NULL );

#undef cc
#undef cd
#undef od


/*
 *   GENERIC DISPLAY ROUTINES
 */


void  display_array  ( char_data*, const char*, const char**,
                           const char**, int );

 
/*
 *   STRING CONVERSION ROUTINES
 */


inline const char* tostring( visible_data* visible, char_data* ch )
{
  return visible->Name( ch, visible->shown );
}


inline const char* tostring( species_data* species, char_data* )
{
  return species->Name( );
}


inline const char* tostring( obj_clss_data* obj_clss, char_data* )
{
  return obj_clss->Name( );
}


inline const char* tostring( thing_array* array, char_data* ch )
{  
  return list_name( ch, array );
}
  

inline int         tostring  ( int a, ... )          { return a; } 
inline float       tostring  ( float a, ... )        { return a; } 
inline double      tostring  ( double a, ... )       { return a; } 
inline const char* tostring  ( const char* a, ... )  { return a; } 


/*
 *   ECHO
 */


void   echo                 ( const char* );


template < class T >
void echo( const char* text, T item )
{
  char tmp  [ TWO_LINES ];

  sprintf( tmp, text, item );
  echo( tmp );

  return;
};


/*
 *   PAGE
 */


void    page              ( char_data*, const char* );
void    page_centered     ( char_data*, const char* );
void    page_underlined   ( char_data*, const char* );
void    next_page         ( link_data* );


template < class T >
void page( char_data* ch, const char* text, T item )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    page( ch, tmp );
    }
};


template < class S, class T >
void page( char_data* ch, const char* text, S item1, T item2 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    page( ch, tmp );
    }
};


template < class S, class T, class U >
void page( char_data* ch, const char* text, S item1, T item2, U item3 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    page( ch, tmp );
    }
};


template < class S, class T, class U, class V >
void page( char_data* ch, const char* text, S item1, T item2,
  U item3, V item4 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text,
      tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ), tostring( item4, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    page( ch, tmp );
    }

  return;
};


template < class S, class T, class U, class V, class X >
void page( char_data* ch, const char* text, S item1, T item2,
  U item3, V item4, X item5 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text,
      tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ), tostring( item4, ch ),
      tostring( item5, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    page( ch, tmp );
    }

  return;
};


template < class S, class T, class U, class V, class X, class W >
void page( char_data* ch, const char* text, S item1, T item2,
  U item3, V item4, X item5, W item6 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text,
      tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ), tostring( item4, ch ),
      tostring( item5, ch ), tostring( item6, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    page( ch, tmp );
    }

  return;
};


inline void page_header( char_data* ch, const char* text )
{
  link_data*   link;
  text_data*  paged;

  if( ch != NULL && ( link = ch->link ) != NULL ) {
    paged       = link->paged;
    link->paged = NULL; 
    page( ch, text );
    cat( link->paged, paged );
    }

  return;
}


template < class T >
void page_header( char_data* ch, const char* text, T item )
{
  char tmp  [ SIX_LINES ];

  if( ch != NULL && ch->link != NULL ) {
    sprintf( tmp, text, tostring( item, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    page_header( ch, tmp );
    }

  return;
};


/*
 *   PAGE_UNDERLINED
 */


template < class T >
void page_underlined( char_data* ch, const char* text, T item )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item, ch ) );
    page_underlined( ch, tmp );
    }
};


template < class S, class T >
void page_underlined( char_data* ch, const char* text, S item1, T item2 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ) );
    page_underlined( ch, tmp );
    }

  return;
};


/*
 *   PAGE_CENTERED
 */


template < class S >
void page_centered( char_data* ch, const char* text, S item )
{
  char tmp  [ TWO_LINES ];

  sprintf( tmp, text, tostring( item, ch ) );
  page_centered( ch, tmp );
}


/*
 *   PAGE_DIVIDER
 */


inline void page_divider( char_data* ch, const char* text, int i )
{
  char tmp  [ TWO_LINES ];

  page( ch, "\r\n" );
  sprintf( tmp, "-- %s (%d) --",  text, i );
  tmp[3] = toupper( tmp[3] );
  page_centered( ch, tmp );
  page( ch, "\r\n" );
}


/*
 *   FORMATTED PAGE
 */


template < class T >
void fpage( char_data* ch, const char* text, T item )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    fpage( ch, tmp );
    }

  return;
};


template < class S, class T >
void fpage( char_data* ch, const char* text, S item1, T item2 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    fpage( ch, tmp );
    }

  return;
};


template < class S, class T, class U >
void fpage( char_data* ch, const char* text, S item1, T item2, U item3 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    fpage( ch, tmp );
    }

  return;
};


template < class S, class T, class U, class V >
void fpage( char_data* ch, const char* text, S item1, T item2, U item3,
  V item4 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ), tostring( item4, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    fpage( ch, tmp );
    }

  return;
};


template < class S, class T, class U, class V, class X >
void fpage( char_data* ch, const char* text, S item1, T item2, U item3,
  V item4, X item5 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ), tostring( item4, ch ),
      tostring( item5, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    fpage( ch, tmp );
    }

  return;
};


template < class S, class T, class U, class V, class X, class Y >
void fpage( char_data* ch, const char* text, S item1, T item2, U item3,
  V item4, X item5, Y item6 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ), tostring( item4, ch ),
      tostring( item5, ch ), tostring( item6, ch ) );
    if( *text == '%' )
      *tmp = toupper( *tmp );
    fpage( ch, tmp );
    }

  return;
};


/*
 *   SEND
 */


void    send              ( link_data*, const char* );


inline void write_to_buffer( link_data* link, const char* message )
{
  send( link, message );
  return;
}


inline void send( char_data* ch, const char* text )
{
  if( ch != NULL )
    send( ch->link, text );

  return;
}


inline void send( const char* text, char_data* ch )
{
  send( ch, text );
  return;
}


template < class T >
inline void send( link_data* link, const char* text, T item )
{
  char tmp  [ SIX_LINES ];

  sprintf( tmp, text, item );
  corrupt( tmp, SIX_LINES, "Send" );
  send( link, tmp );

  return;
}


template < class T >
void send( char_data* ch, const char* text, T item )
{
  char tmp  [ SIX_LINES ];

  if( ch != NULL && ch->link != NULL ) {
    sprintf( tmp, text, tostring( item, ch ) );
    corrupt( tmp, SIX_LINES, "Send" );
    send( ch, *text == '%' ? capitalize( tmp ) : tmp );
    }

  return;
};


template < class S, class T >
void send( char_data* ch, const char* text, S item1, T item2 )
{
  char tmp  [ SIX_LINES ];

  if( ch != NULL && ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ) );
    corrupt( tmp, SIX_LINES, "Send" );
    send( ch, *text == '%' ? capitalize( tmp ) : tmp );
    }

  return;
};


template < class S, class T, class U >
inline void send( link_data* link, const char* text, S item1, T item2,
  U item3 )
{
  char tmp  [ SIX_LINES ];

  sprintf( tmp, text, item1, item2, item3 );
  corrupt( tmp, SIX_LINES, "Send" );
  send( link, tmp );

  return;
}


template < class S, class T, class U >
void send( char_data* ch, const char* text, S item1, T item2, U item3 )
{
  char tmp  [ SIX_LINES ];

  if( ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ) );
    corrupt( tmp, SIX_LINES, "Send" );
    send( ch, *text == '%' ? capitalize( tmp ) : tmp );
    }

  return;
};


template < class S, class T, class U, class V >
void send( link_data* link, const char* text, S item1, T item2, U item3,
  V item4 )
{
  send( link->player, text, item1, item2, item3, item4 );
  return;
}


template < class S, class T, class U, class V >
void send( char_data* ch, const char* text, S item1, T item2, U item3,
  V item4 )
{
  char tmp  [ SIX_LINES ];

  if( ch != NULL && ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ), tostring( item4, ch ) );
    corrupt( tmp, SIX_LINES, "Send" );
    send( ch, *text == '%' ? capitalize( tmp ) : tmp );
    }

  return;
};


template < class S, class T, class U, class V, class W >
void send( char_data* ch, const char* text, S item1, T item2, U item3,
  V item4, W item5 )
{
  char tmp  [ SIX_LINES ];

  if( ch != NULL && ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ), tostring( item4, ch ), tostring( item5, ch ) );
    corrupt( tmp, SIX_LINES, "Send" );
    send( ch, *text == '%' ? capitalize( tmp ) : tmp );
    }

  return;
};


template < class S, class T, class U, class V, class W, class X >
void send( char_data* ch, const char* text, S item1, T item2, U item3,
  V item4, W item5, X item6 )
{
  char tmp  [ SIX_LINES ];

  if( ch != NULL && ch->link != NULL ) {
    sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
      tostring( item3, ch ), tostring( item4, ch ),
      tostring( item5, ch ), tostring( item6, ch ) );
    corrupt( tmp, SIX_LINES, "Send" );
    send( ch, *text == '%' ? capitalize( tmp ) : tmp );
    }

  return;
};


/*
 *   SEND_SEEN
 */


template < class T >
void send_seen( char_data* ch, const char* text, T item )
{
  char_data*  rch;

  if( ch->array != NULL ) 
    for( int i = 0; i < *ch->array; i++ ) 
      if( ( rch = character( ch->array->list[i] ) ) != NULL
        && rch != ch && ch->Seen( rch ) && rch != (char_data*) item )
        send( rch, text, item );

  return;
};


template < class S, class T >
void send_seen( char_data* ch, const char* text, S item1, T item2 )
{
  char_data*  rch;

  if( ch->array != NULL ) 
    for( int i = 0; i < *ch->array; i++ ) 
      if( ( rch = character( ch->array->list[i] ) ) != NULL
        && rch != ch && ch->Seen( rch )
        && rch != (char_data*) item1 && rch != (char_data*) item2 )
        send( rch, text, item1, item2 );

  return;
};


template < class S, class T, class U >
void send_seen( char_data* ch, const char* text, S item1, T item2,
  U item3 )
{
  char_data*  rch;

  if( ch->array != NULL ) 
    for( int i = 0; i < *ch->array; i++ ) 
      if( ( rch = character( ch->array->list[i] ) ) != NULL
        && rch != ch && ch->Seen( rch )
        && rch != (char_data*) item1 && rch != (char_data*) item2
        && rch != (char_data*) item3 )
        send( rch, text, item1, item2, item3 );

  return;
};


template < class S, class T, class U, class V >
void send_seen( char_data* ch, const char* text, S item1, T item2,
  U item3, V item4 )
{
  char_data*  rch;

  if( ch->array != NULL ) 
    for( int i = 0; i < *ch->array; i++ ) 
      if( ( rch = character( ch->array->list[i] ) ) != NULL
        && rch != ch && ch->Seen( rch )
        && rch != (char_data*) item1 && rch != (char_data*) item2
        && rch != (char_data*) item3 && rch != (char_data*) item4 )
        send( rch, text, item1, item2, item3, item4 );

  return;
};


/*
 *   SEND_ROOM
 */


inline void send( thing_array& array, const char* text )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) 
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING )
      send( rch, text );

  return;
};


template < class T >
void send( thing_array& array, const char* text, T item )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) 
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING && rch != (char_data*) item )
      send( rch, text, item );

  return;
};


template < class S, class T >
void send( thing_array& array, const char* text, S item1, T item2 )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) {
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING && rch != (char_data*) item1
      && rch != (char_data*) item2 )
      send( rch, text, item1, item2 );
    }

  return;
};


template < class S, class T, class U >
void send( thing_array& array, const char* text, S item1, T item2,
  U item3 )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) {
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING && rch != (char_data*) item1
      && rch != (char_data*) item2 && rch != (char_data*) item3 )
      send( rch, text, item1, item2, item3 );
    }

  return;
};


template < class S, class T, class U, class V  >
void send( thing_array& array, const char* text, S item1, T item2,
  U item3, V item4 )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) {
    if( ( rch = character( array[i] ) ) != NULL 
      && rch->position > POS_SLEEPING && rch != (char_data*) item1
      && rch != (char_data*) item2 && rch != (char_data*) item3
      && rch != (char_data*) item4 )
      send( rch, text, item1, item2, item3, item4  );
    }

  return;
};


template < class S, class T, class U, class V, class W >
void send( thing_array& array, const char* text, S item1, T item2,
  U item3, V item4, W item5 )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) {
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING && rch != (char_data*) item1
      && rch != (char_data*) item2 && rch != (char_data*) item3
      && rch != (char_data*) item4 && rch != (char_data*) item5 )
      send( rch, text, item1, item2, item3, item4, item5 );
    }

  return;
};


template < class S, class T, class U, class V, class W, class X >
void send( thing_array& array, const char* text, S item1, T item2,
  U item3, V item4, W item5, X item6 )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) {
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING && rch != (char_data*) item1
      && rch != (char_data*) item2 && rch != (char_data*) item3
      && rch != (char_data*) item4 && rch != (char_data*) item5
      && rch != (char_data*) item6 )
      send( rch, text, item1, item2, item3, item4, item5, item6 );
    }

  return;
};


/*
 *   SEND_UNDERLINED
 */


void send_underlined( char_data*, const char* );


template < class S >
void send_underlined( char_data* ch, const char* text, S item )
{
  char tmp  [ TWO_LINES ];

  sprintf( tmp, text, tostring( item, ch ) );
  send_underlined( ch, tmp );

  return;
}


/*
 *   SEND_CENTERED
 */


void send_centered( char_data*, const char* );


template < class S >
void send_centered( char_data* ch, const char* text, S item )
{
  char tmp  [ TWO_LINES ];

  sprintf( tmp, text, tostring( item, ch ) );
  send_centered( ch, tmp );

  return;
}


/*
 *   FSEND_ALL
 */


template < class T >
void fsend_all( room_data* room, const char* text, T item )
{
  char_data* rch;

  for( int i = 0; i < room->contents; i++ ) 
    if( ( rch = character( room->contents[i] ) ) != NULL
      && rch->position > POS_SLEEPING )
      fsend( rch, text, item );

  return;
}


/*
 *   FORMATTED SEND 
 */


template < class T >
void fsend( char_data* ch, const char* text, T item )
{
  char tmp  [ SIX_LINES ];
 
  sprintf( tmp, text, tostring( item, ch ) );
  corrupt( tmp, SIX_LINES, "Fsend" );

  if( *text == '%' )
    *tmp = toupper( *tmp );

  fsend( ch, tmp );

  return;
} 


template < class S, class T >
void fsend( char_data* ch, const char* text, S item1, T item2 )
{
  char tmp  [ SIX_LINES ];

  sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ) );
  corrupt( tmp, SIX_LINES, "Fsend" );

  if( *text == '%' )
    *tmp = toupper( *tmp );

  fsend( ch, tmp );
};


template < class S, class T, class U >
void fsend( char_data* ch, const char* text, S item1, T item2, U item3 )
{
  char tmp  [ SIX_LINES ];

  sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
    tostring( item3, ch ) );
  corrupt( tmp, SIX_LINES, "Fsend" );

  if( *text == '%' )
    *tmp = toupper( *tmp );

  fsend( ch, tmp );
};


template < class S, class T, class U, class V >
void fsend( char_data* ch, const char* text, S item1, T item2,
  U item3, V item4 )
{
  char tmp  [ SIX_LINES ];

  sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
    tostring( item3, ch ), tostring( item4, ch ) );
  corrupt( tmp, SIX_LINES, "Fsend" );

  if( *text == '%' )
    *tmp = toupper( *tmp );

  fsend( ch, tmp );
};


template < class S, class T, class U, class V, class W >
void fsend( char_data* ch, const char* text, S item1, T item2,
  U item3, V item4, W item5 )
{
  char tmp  [ SIX_LINES ];

  sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
    tostring( item3, ch ), tostring( item4, ch ), tostring( item5, ch ) );
  corrupt( tmp, SIX_LINES, "Fsend" );

  if( *text == '%' )
    *tmp = toupper( *tmp );

  fsend( ch, tmp );
};


template < class S, class T, class U, class V, class W, class X >
void fsend( char_data* ch, const char* text, S item1, T item2,
  U item3, V item4, W item5, X item6 )
{
  char tmp  [ SIX_LINES ];

  sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ),
    tostring( item3, ch ), tostring( item4, ch ),
    tostring( item5, ch ), tostring( item6, ch ) );
  corrupt( tmp, SIX_LINES, "Fsend" );

  if( *text == '%' )
    *tmp = toupper( *tmp );

  fsend( ch, tmp );
};


/*
 *   FORMATTED SEND ROOM
 */


template < class T >
void fsend( thing_array& array, const char* text, T item )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) 
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING && rch != (char_data*) item )
      fsend( rch, text, item );

  return;
} 


template < class S, class T >
void fsend( thing_array& array, const char* text, S item1, T item2 )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) {
    if( ( rch = character( array[i] ) ) != NULL  
      && rch->position > POS_SLEEPING && rch != (char_data*) item1
      && rch != (char_data*) item2 )
      fsend( rch, text, item1, item2 );
    }

  return;
} 


template < class S, class T, class U >
void fsend( thing_array& array, const char* text, S item1, T item2,
  U item3 )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) {
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING && rch != (char_data*) item1
      && rch != (char_data*) item2 && rch != (char_data*) item3 )
      fsend( rch, text, item1, item2, item3 );
    }

  return;
} 


template < class S, class T, class U, class V >
void fsend( thing_data& array, const char* text, S item1, T item2,
  U item3, V item4 )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) {
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING && rch != (char_data*) item1
      && rch != (char_data*) item2 && rch != (char_data*) item3
      && rch != (char_data*) item4 )
      fsend( rch, text, item1, item2, item3, item4 );
    }

  return;
} 


template < class S, class T, class U, class V, class W >
void fsend( thing_array& array, const char* text, S item1, T item2,
  U item3, V item4, W item5 )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) {
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING && rch != (char_data*) item1
      && rch != (char_data*) item2 && rch != (char_data*) item3
      && rch != (char_data*) item4 && rch != (char_data*) item5 )
      fsend( rch, text, item1, item2, item3, item4, item5 );
    }
} 


template < class S, class T, class U, class V, class W, class X >
void fsend( thing_array& array, const char* text, S item1, T item2,
  U item3, V item4, W item5, X item6 )
{
  char_data*  rch;

  for( int i = 0; i < array; i++ ) {
    if( ( rch = character( array[i] ) ) != NULL
      && rch->position > POS_SLEEPING && rch != (char_data*) item1
      && rch != (char_data*) item2 && rch != (char_data*) item3
      && rch != (char_data*) item4 && rch != (char_data*) item5
      && rch != (char_data*) item6 )
      fsend( rch, text, item1, item2, item3, item4, item5, item6 );
    }
} 


/*
 *   FORMATTED_SEND_SEEN
 */


template < class T >
void fsend_seen( char_data* ch, const char* text, T item )
{
  char_data*  rch;

  for( int i = 0; i < *ch->array; i++ ) {
    if( ( rch = character( ch->array->list[i] ) ) != NULL
      && rch != ch && ch->Seen( rch ) && rch != (char_data*) item )
      fsend( rch, text, item );
    }
};


template < class S, class T >
void fsend_seen( char_data* ch, const char* text, S item1, T item2 )
{
  char_data*  rch;

  for( int i = 0; i < *ch->array; i++ ) {
    if( ( rch = character( ch->array->list[i] ) ) != NULL
      && rch != ch && ch->Seen( rch )
      && rch != (char_data*) item1 && rch != (char_data*) item2 )
      fsend( rch, text, item1, item2 );
    }
};


template < class S, class T, class U >
void fsend_seen( char_data* ch, const char* text, S item1, T item2,
  U item3 )
{
  char_data*  rch;

  for( int i = 0; i < *ch->array; i++ ) {
    if( ( rch = character( ch->array->list[i] ) ) != NULL
      && rch != ch && ch->Seen( rch ) && rch != (char_data*) item1
      && rch != (char_data*) item2 && rch != (char_data*) item3 )
      fsend( rch, text, item1, item2, item3 );
     }
};


template < class S, class T, class U, class V >
void fsend_seen( char_data* ch, const char* text, S item1, T item2,
  U item3, V item4 )
{
  char_data*  rch;

  for( int i = 0; i < *ch->array; i++ ) {
    if( ( rch = character( ch->array->list[i] ) ) != NULl
      && rch != ch && ch->Seen( rch ) && rch != (char_data*) item1
      && rch != (char_data*) item2 && rch != (char_data*) item3
      && rch != (char_data*) item4 )
      fsend( rch, text, item1, item2, item3, item4 );
    }
};


/*
 *   SEND_COLOR
 */


template < class T >
inline void send_color( char_data* ch, int color, const char* text, T item )
{
  char tmp  [ SIX_LINES ];
 
  sprintf( tmp, text, tostring( item, ch ) );
  send_color( ch, color, tmp );
}


template < class S, class T >
inline void send_color( char_data* ch, int color, const char* text,
  S item1, T item2 )
{
  char tmp  [ SIX_LINES ];
 
  sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ) );
  send_color( ch, color, tmp );
}


/*
 *   TITLE
 */


void  page_title    ( char_data*, const char* );
void  send_title    ( char_data*, const char* );


template < class S >
inline void page_title( char_data* ch, const char* text, S item )
{
  char tmp  [ TWO_LINES ];
 
  sprintf( tmp, text, tostring( item, ch ) );
  page_title( ch, tmp );
  
  return;
}


template < class S >
inline void send_title( char_data* ch, const char* text, S item )
{
  char tmp  [ TWO_LINES ];
 
  sprintf( tmp, text, tostring( item, ch ) );
  send_title( ch, tmp );
  
  return;
}