#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 );
}