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/
#include "ctype.h"
#include "sys/types.h"
#include "stdio.h"
#include "stdlib.h"
#include "define.h"
#include "struct.h"


void  send_descr        ( char_data*, const char* );
void  extract           ( extra_data*, wizard_data*, char );


/*
 *   READ/WRITE EXTRAS
 */


void read_extra( FILE* fp, extra_array& list )
{
  extra_data*   extra;
  char         letter;

  for( ; ; ) {
    if( ( letter = fread_letter( fp ) ) != 'E' )
      break;
    extra           = new extra_data;
    extra->keyword  = fread_string( fp, MEM_EXTRA );
    extra->text     = fread_string( fp, MEM_EXTRA );
    list += extra;
    }

  if( letter != '!' )
    ungetc( letter, fp );
}


void write_extras( FILE* fp, extra_array& list )
{
  for( int i = 0; i < list; i++ ) {
    fprintf( fp, "E\n" );
    fprintf( fp, "%s~\n", list[i]->keyword );
    fprintf( fp, "%s~\n", list[i]->text );
    }
}


/* 
 *   SUPPORT ROUTINES
 */


void show_extras( char_data* ch, extra_array& list )
{
  char tmp [ 3*MAX_STRING_LENGTH ];

  if( is_empty( list ) )
    return;

  page( ch, "\n\rExtra Descriptions:\n\r" );

  for( int i = 0; i < list; i++ ) {
    sprintf( tmp, "[ %s ]\n\r%s", list[i]->keyword, list[i]->text );
    page( ch, tmp );
    }

  return;
}


void page_descr( char_data* ch, const char* text )
{
  char tmp  [ 3*MAX_STRING_LENGTH ];

  convert_to_ansi( ch, text, tmp );
  page( ch, tmp );

  return;
}


/*
 *   SUBROUTINES
 */


const char* Extra_Data :: Keywords( char_data* )
{
  return keyword;
}


void Obj_Data :: Look_At( char_data* ch )
{
  page_descr( ch, is_set( extra_flags, OFLAG_IDENTIFIED ) 
    ? after_descr( pIndexData ) : before_descr( pIndexData ) ); 

  if( pIndexData->item_type == ITEM_ARMOR ) {
    page( ch, "\n\r  Condition: %s\n\r",
      condition_name( ch, TRUE ) );
    }
  else if( pIndexData->item_type == ITEM_WEAPON ) {
    page( ch, "\n\r    Condition: %s\n\r Weapon Class: %s\n\r",
      condition_name( ch, TRUE ),
      weapon_class( pIndexData ) );
    }
  else if( pIndexData->item_type == ITEM_DECK_CARDS ) { 
    look_cards( ch, this );
    }
  else if( pIndexData->item_type == ITEM_KEYRING ) {
    look_in( ch, this );
    }
  else if( pIndexData->item_type == ITEM_DRINK_CON ) {
    page( ch, "\n\rVolume: %.2f liters\n\r",
      float( value[0]/100. ) );
    } 
  else if( pIndexData->item_type == ITEM_CONTAINER ) {
    if( !is_set( &value[1], CONT_CLOSED ) ) {
      page( ch, "\n\rCapacity: %.2f lbs\n\r",
        float( pIndexData->value[0] ) );
      page( ch, "Contains: %.2f lbs\n\r", contents.weight/100. );
      }
    }
}


const char* before_descr( obj_clss_data* obj )
{
  extra_data* ed;

  if( ( obj = get_obj_index( obj->fakes ) ) == NULL )
    return "Item is bugged - Fakes non-existent object.\n\r"; 

  for( int i = 0; i < obj->extra_descr; i++ ) {
    ed = obj->extra_descr[i]; 
    if( !strcmp( ed->keyword, "either" )
      || !strcmp( ed->keyword, "before" ) )
      return ed->text;
    }

  return "Item is bugged - Missing non-identified description.\n\r";
}


const char* after_descr( obj_clss_data* obj )
{
  extra_data*  ed;

  for( int i = 0; i < obj->extra_descr; i++ ) {
    ed = obj->extra_descr[i];
    if( !strcmp( ed->keyword, "either" )
      || !strcmp( ed->keyword, "after" ) )
      return ed->text;
    }

  return "Item is bugged - Missing identified description.\n\r";
}


/*
  for( ed = obj->extra_descr; ; ed = ed->next ) {
    if( ed == NULL ) {
      if( !first || ( ed = obj->pIndexData->extra_descr ) == NULL )
        break;
      first = FALSE;
      }
    if( is_name( argument, ed->keyword ) 
      && strcmp( ed->keyword, "before" )
      && strcmp( ed->keyword, "after" )
      && strcmp( ed->keyword, "either" ) ) {  
      send_descr( ch, ed->text, obj, FALSE );
      return TRUE;
      }
    }

  return FALSE;
}
*/


/*
 *   EDITING ROUTINE
 */


void edit_extra( extra_array& array, wizard_data* wizard, int offset,
  char* argument, char* text )
{
  char            arg  [ MAX_INPUT_LENGTH ];
  extra_data*      ed;
  extra_data**   edit;
  int               i;

  edit = (extra_data**) ( int( wizard )+offset );

  if( *argument == '\0' ) {
    if( is_empty( array ) ) 
      send( wizard, "No extras found.\n\r" );
    else 
      for( i = 0; i < array; i++ ) {
        page( wizard, "[%2d]  %s\n\r", i+1, array[i]->keyword );
        page( wizard, array[i]->text );
        }
    return;
    }

  if( exact_match( argument, "delete" ) ) {
    if( ( i = atoi( argument )-1 ) < 0 || i >= array )   
      send( wizard, "Extra not found to remove.\n\r" );
    else {
      send( wizard, "Extra %d, '%s' removed.\n\r",
        i+1, array.list[i]->keyword );
      remove( array, i );
      *edit = array.list[i]; 
      extract( wizard, offset, text );
      }
    return;
    }

  if( exact_match( argument, "new" ) ) {
    ed          = new extra_data;
    ed->keyword = alloc_string( argument, MEM_EXTRA );
    ed->text    = alloc_string( "No description.\n\r", MEM_EXTRA );
    *edit       = ed; 
    array += ed;
    send( wizard, "Extra %s created.\n\r", ed->keyword );
    return;
    }

  argument = one_argument( argument, arg );

  if( ( i = atoi( arg )-1 ) < 0 || i >= array ) {
    for( i = 0; ; i++ ) {
      if( i == array ) {
        send( wizard, "Extra not found.\n\r" );
        return;
        }
      if( is_name( arg, array[i]->keyword ) ) 
        break;
      }
    }

  ed = array[i]; 

  if( *argument != '\0' ) {
    free_string( ed->keyword, MEM_OBJ_CLSS );
    ed->keyword = alloc_string( argument, MEM_OBJ_CLSS );
    send( wizard, "Extra name set to: %s\n\r", ed->keyword );
    return;
    }

  *edit = ed;

  send( wizard, "%s now operates on extra %d, '%s'.\n\r",
    text, i+1, ed->keyword );
}