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


/*
 *   SET STRINGS
 */


void set_string( char_data* ch, char* argument, char*& string,
  const char* subject, int mem_type )
{
  if( *argument == '\0' ) {
    send( ch, "Set %s to what?\n\r[ Current Value: %s ]\n\r",
      subject, string );
    return;
    }  

  send( ch, "%s set.\n\r[ New:  %s ]\n\r[ Prev: %s ]\n\r",
    subject, argument, string );
  free_string( string, mem_type );
  string = alloc_string( argument, mem_type );

  return;
}


const char* string_field :: set( char_data* ch, const char* subject,
  char* argument )
{
  static char  buf  [ FOUR_LINES ];

  if( *argument == '\0' ) {
    send( ch, "Set %s of %s to?\n\r[ Current value: %s ]\n\r",
      name, subject, *value );
    return empty_string;
    }

  if( func == NULL ) {
    if( !strcasecmp( argument, "blank" ) ) {
      send( ch, "%s on %s set blank.\n\r[ Prev: %s ]\n\r",
        name, subject, *value );
      free_string( *value, mem_type );
      *value = empty_string;
      sprintf( buf, "%s set blank.", name );
      return buf;
      }
    }
  else {
    if( ( *func )( ch, argument, *value ) == FALSE )
      return empty_string;
    }

  send( ch, "%s on %s set.\n\r[ New:  %s ]\n\r[ Prev: %s ]\n\r",
    name, subject, argument, *value );
  free_string( *value, mem_type );
  *value = alloc_string( argument, mem_type );
  sprintf( buf, "%s set to %s.", name, argument );

  return buf;
};


/*
 *   SET TYPES
 */


void set_type( char_data* ch, char* argument, int& value,
  const char* field, const char* subject, int max,
  const char** word1, const char** word2 )
{
  int i;

  if( word2 == NULL )
     word2 = word1+1;

  if( *argument == '\0' ) {
    page( ch, "%s Options:\n\r", field );
    for( i = 0; i < max; i++ ) 
      page( ch, "%20s%s", element( i, word1, word2 ),
        i%3 == 2 ? "\n\r" : "" );
    page( ch, "\n\r%s[ Current Value: %s ]\n\r", i%3 != 0 ? "\n\r" : "",
      element( value, word1, word2 ) );
    return;
    }

  for( i = 0; i < max; i++ ) {
    if( fmatches( element( i, word1, word2 ), argument ) ) {
      value = i;
      send( ch, "%s on %s set to %s.\n\r", field, subject,
        element( i, word1, word2 ) );
      return;
      }
    }

  send( ch, "Unknown %s.\n\r", subject );

  return;
}


const char* type_field :: set( char_data* ch, const char* subject,
  char* argument )
{
  static char  buf  [ TWO_LINES ];
  char         tmp  [ TWO_LINES ];
  int            i;

  if( argument[0] == '\0' ) {
    send( ch, "%s Options:\n\r", name );
    for( i = 0; i < max; i++ ) {
      sprintf( tmp, "%20s%s", element( i ), i%3 == 2 ? "\n\r" : "" );
      send( tmp, ch );
      }
    sprintf( tmp, "\n\r%s[ Current Value: %s ]\n\r", i%3 != 0 ? "\n\r" : "",
      element( *value ) );
    send( tmp, ch );
    return empty_string;
    }

  int length = strlen( argument );

  for( i = 0; i < max; i++ ) {
    if( !strncasecmp( element( i ), argument, length ) ) {
      *value = i;
      sprintf( tmp, "%s on %s set to %s.\n\r", name, subject, element( i ) );
      tmp[0] = toupper( tmp[0] );
      send( tmp, ch );
      sprintf( buf, "%s set to %s.", name, element( i ) );
      return buf;
      }
    }

  sprintf( tmp, "Unknown %s.\n\r", name );
  send( tmp, ch );

  return empty_string;
}


/*
 *   INTEGERS
 */


const char* int_field :: set( char_data *ch, const char* subject,
  char *argument )
{
  char*  tmp  = static_string( );
  int    num;

  if( *argument == '\0' ) {
    send( ch, "Set %s of %s to?\n\r[ Allowed range: %d to %d - current\
 value: %d ]\n\r", name, subject, min, max, *value );
    return empty_string;
    }

  if( ( num = atoi( argument ) ) < min || num > max ) {
    send( ch, "The allowed range for %s is from %d to %d.\n\r",
      name, min, max );
    return empty_string;
    }

  if( num == *value ) {
    send( ch, "%s on %s is already set to %d\n\r", 
      name,subject, num );
    return empty_string;
    }

  send( ch, "%s on %s set to %d.\n\r[ Prev. Value: %d ]\n\r",
    name, subject, num, *value );
  sprintf( tmp, "%s set to %d from %d.", name, num, *value );

  *value = num;

  return tmp;
}


/*
 *   CENTS
 */


const char* cent_field :: set( char_data *ch, const char* subject,
  char *argument )
{
  char*  tmp  = static_string( );
  int    num;

  if( *argument == '\0' ) {
    send( ch, "Set %s of %s to?\n\r[ Allowed range: %.2f to %.2f - current\
 value: %.2f ]\n\r", name, subject, (float) min/100, (float) max/100, *value );
    return empty_string;
    }

  if( ( num = 100*atof( argument ) ) < min || num > max ) {
    send( ch, "The allowed range for %s is from %.2f to %.2f.\n\r",
      name, (float) min/100, (float) max/100 );
    return empty_string;
    }

  if( num == *value ) {
    send( ch, "%s on %s is already set to %.2f\n\r", 
      name, subject, (float) num/100 );
    return empty_string;
    }

  send( ch, "%s on %s set to %.2f.\n\r[ Prev. Value: %.2f ]\n\r",
    name, subject, (float) num/100, (float) *value/100 );
  sprintf( tmp, "%s set to %.2f from %.2f.",
    name, (float) num/100, (float) *value/100 );

  *value = num;

  return tmp;
}


/*
 *   DICE
 */


const char* dice_field :: set( char_data* ch, const char* subject,
  char* argument )
{
  static char    buf  [ TWO_LINES ];
  char           tmp  [ TWO_LINES ];
  dice_data    dice1;
  dice_data    dice2;

  dice1 = *value;

  if( argument[0] == '\0' ) {
    sprintf( tmp, "Set %s of %s to?\n\r[ Current value: %dd%d+%d ]\n\r", 
      name, subject, dice1.number, dice1.side, dice1.plus );
    send( tmp, ch );
    return empty_string;
    }

  dice2.number = atoi( argument );
  for( ; isdigit( *argument ); argument++ );
  if( toupper( *argument++ ) != 'D' ) {
    send( "Incorrect format: #d#+#.\n\r", ch );
    return empty_string;
    }
  dice2.side = atoi( argument );
  for( ; isdigit( *argument ); argument++ );
  dice2.plus = ( *argument++ == '+' ? atoi( argument ) : 0 );

  sprintf( tmp, "%s on %s set to %dd%d+%d.\n\r[ Prev. Value: %dd%d+%d ]\n\r",
    name, subject, dice2.number, dice2.side, dice2.plus,
    dice1.number, dice1.side, dice1.plus );
  send( tmp, ch );

  *value = (int) dice2;

  sprintf( buf, "%s set to %dd%d+%d.",
    name, dice2.number, dice2.side, dice2.plus );

  return buf; 
}