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/
/*
 *   FILE LOCATIONS
 */


#define AREA_DIR           "../area/"
#define AREA_PREV_DIR      "../prev/area/"
#define BACKUP_DIR         "../reimb/"
#define CLAN_DIR           "../clans/"
#define CLAN_NOTE_DIR      "../notes/clans/"
#define IMMORTAL_LOG_DIR   "../logs/immortal/"
#define MOB_LOG_DIR        "../logs/mob/"
#define MAIL_DIR           "../mail/"
#define NOTE_DIR           "../notes/"
#define OBJ_LOG_DIR        "../logs/object/"
#define PLAYER_DIR         "../player/"  
#define PLAYER_LOG_DIR     "../logs/player/" 
#define PLAYER_PREV_DIR    "../prev/player/"
#define ROOM_DIR           "../rooms/"
#define ROOM_PREV_DIR      "../prev/rooms/" 
#define ROOM_LOG_DIR       "../logs/room/"
#define TABLE_DIR          "../tables/"
#define W3_DIR             "../../www/html/"

#define ACCOUNT_FILE     "../files/accounts"
#define AREA_LIST        "../area/area.lst"   
#define BADNAME_FILE     "../files/badname.txt"
#define BANNED_FILE      "../files/banned.txt"   
#define BUG_FILE         "../files/bugs.txt"   
#define FACTION_FILE     "../area/factions.dat"   
#define HELP_FILE        "../area/help.are"
#define IMM_LOG_FILE     "../files/immortal.log"
#define LOAD_FILE        "../area/load.dat"
#define NULL_FILE        "/dev/null"  
#define MOB_FILE         "mob.mob"
#define OBJECT_FILE      "obj.obj"
#define PLAYER_LOG_FILE  "../files/player.log" 
#define ABUSE_LOG_FILE   "../files/abuse.log"
#define QUEST_FILE       "../area/quest"
#define RTABLE_FILE      "../files/rtables"
#define SHOP_FILE        "../area/shop.dat"
#define TRAINER_FILE     "../area/trainer.dat"
#define TYPO_FILE        "../files/typos.txt" 
#define WORD_FILE        "../files/words"


/*
 *   BUG FUNCTIONS
 */


void   panic       ( const char* );
void   bug         ( int, const char* );


#define BUG_APHID   3
#define BUG_BEETLE  2
#define BUG_ROACH   1


inline void aphid  ( const char* text )   {  bug( 3, text ); } 
inline void beetle ( const char* text )   {  bug( 2, text ); } 
inline void roach  ( const char* text )   {  bug( 1, text ); }
inline void bug    ( const char* text )   {  bug( 2, text ); }


template < class T >
void aphid( const char* text, T item )
{
  char   tmp  [ TWO_LINES ];
 
  sprintf( tmp, text, tostring( item ) );
  corrupt( tmp, TWO_LINES, "Aphid" );
  
  if( *text == '%' )
    *tmp = toupper( *tmp );

  bug( 3, tmp );

  return;
}


template < class T >
void roach( const char* text, T item )
{
  char   tmp  [ TWO_LINES ];
 
  sprintf( tmp, text, tostring( item, NULL ) );
  corrupt( tmp, TWO_LINES, "Roach" );

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

  bug( 1, tmp );

  return;
}


template < class S, class T >
void roach( const char* text, S item1, T item2 )
{
  char   tmp  [ TWO_LINES ];
 
  sprintf( tmp, text, tostring( item1 ), tostring( item2 ) );
  corrupt( tmp, TWO_LINES, "Roach" );
  
  if( *text == '%' )
    *tmp = toupper( *tmp );

  bug( 1, tmp );

  return;
}


template < class T >
void bug( const char* text, T item )
{
  char   tmp  [ TWO_LINES ];
 
  sprintf( tmp, text, tostring( item, NULL ) );
  corrupt( tmp, TWO_LINES, "Bug" );

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

  bug( tmp );

  return;
}


template < class S, class T >
void bug( const char* text, S item1, T item2 )
{
  char   tmp  [ TWO_LINES ];
 
  sprintf( tmp, text, tostring( item1, NULL ),
    tostring( item2, NULL ) );
  bug( tmp );
}


template < class T >
void panic( const char* text, T item )
{
  char   tmp  [ TWO_LINES ];
 
  sprintf( tmp, text, item );
  
  if( *text == '%' )
    *tmp = toupper( *tmp );

  panic( tmp );
}


template < class S, class T >
void panic( const char* text, S item1, T item2 )
{
  char   tmp  [ TWO_LINES ];
 
  sprintf( tmp, text, item1, item2 );
  
  if( *text == '%' )
    *tmp = toupper( *tmp );

  panic( tmp );
}


inline void corrupt( const char* msg, int length, const char* func )
{
  if( int( strlen( msg ) ) >= length ) 
    roach( "%s: Randomly corrupting memory.", func );
}


/*
 *   FILE ROUTINES
 */


FILE*   open_file         ( const char*, const char*, const char*,
                            bool = FALSE );
FILE*   open_file         ( const char*, const char*,
                            bool = FALSE ); 
void    delete_file       ( const char*, const char*, bool = TRUE );
void    rename_file       ( const char*, const char*,
                            const char*, const char* );

char    fread_letter      ( FILE *fp );
int     fread_number      ( FILE *fp );
void    fread_to_eol      ( FILE *fp );
char*   fread_block       ( FILE* );
char*   fread_string      ( FILE*, int );
char*   fread_word        ( FILE* );


void write_all  ( bool = FALSE );


/*
 *   LOG ROUTINES
 */


void   immortal_log       ( char_data*, char*, char* );
void   mob_log            ( char_data*, int, const char* ); 
void   obj_log            ( char_data*, int, const char* ); 
void   room_log           ( char_data*, int, const char* ); 
void   player_log         ( char_data*, const char* );


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

  sprintf( tmp, text, tostring( item1, ch ) );
  player_log( ch, tmp );

  return;
}

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

  sprintf( tmp, text, tostring( item1, ch ), tostring( item2, ch ) );
  player_log( ch, tmp );

  return;
}


/*
 *   HELP ROUTINES
 */


bool   save_help          ( char_data* = NULL );
  

/*
 *   QUITTING ROUTINES
 */


void   forced_quit        ( player_data*, bool = FALSE );


/*
 *   WEBPAGE ROUTINES
 */


void w3_help  ( void );
void w3_who   ( void );