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 "define.h"
#include "struct.h"


const int  coin_vnum  [] = { OBJ_COPPER, OBJ_SILVER, OBJ_GOLD, OBJ_PLATINUM }; 
const int   coin_value [] = { 1, 10, 100, 1000 };
const char*  coin_name [] = { "cp", "sp", "gp", "pp" };


/*
 *  VARIOUS MONEY ROUTINES
 */


int monetary_value( obj_data* obj )
{
  int i;

  if( obj->pIndexData->item_type == ITEM_MONEY ) 
    for( i = 0; i < MAX_COIN; i++ )
      if( obj->pIndexData->vnum == coin_vnum[i] ) 
        return obj->selected*coin_value[i];

  return 0;
}


char* coin_phrase( char_data* ch )
{
  int      coins  [ MAX_COIN ];
  obj_data*  obj;

  vzero( coins, MAX_COIN );

  for( int i = 0; i < ch->contents; i++ ) {
    if( ( obj = object( ch->contents[i] ) ) != NULL
      && obj->pIndexData->item_type == ITEM_MONEY ) 
      for( int j = 0; j < MAX_COIN; j++ )
        if( obj->pIndexData->vnum == coin_vnum[j] ) 
          coins[j] += obj->number;
    }

  return coin_phrase( coins );
}


char* coin_phrase( int* num )
{
  static char   buf  [ ONE_LINE ];
  bool         flag  = FALSE;
  int             i;
  int          last;
 
  for( last = 0; last < MAX_COIN; last++ )
    if( num[ last ] != 0 )
      break;

  buf[ 0 ] = '\0';

  for( i = MAX_COIN - 1; i >= last; i-- ) {
    if( num[ i ] == 0 )
      continue;
    sprintf( buf + strlen( buf ), "%s %s%d %s", flag ? "," : "",
      ( i == last && flag ) ? "and " : "", num[i], coin_name[i] );
    flag = TRUE;
    }

  if( !flag ) 
    sprintf( buf, " none" );

  return &buf[0];
}


int get_money( char_data* ch )
{
  obj_data*  obj;
  int        sum  = 0;

  for( int i = 0; i < ch->contents; i++ )
    for( int j = 0; j < 4; j++ )
      if( ( obj = object( ch->contents[i] ) ) != NULL
        && obj->pIndexData->vnum == coin_vnum[j] ) 
        sum += coin_value[j]*obj->number;

  return sum;
}


bool remove_silver( char_data* ch )
{
  obj_data* obj;

  if( ( obj = find_vnum( ch->contents, coin_vnum[1] ) ) != NULL ) {
    obj->Extract( 1 );
    return TRUE;
    }

  return FALSE;
}
 

void add_coins( char_data* ch, int amount, char* message )
{
  obj_data*  obj;
  int        num  [ 4 ];
  int          i;

  for( i = MAX_COIN - 1; i >= 0; i-- ) {
    if( ( num[i] = amount/coin_value[i] ) > 0 ) {
      amount -= num[i]*coin_value[i];
      obj = create( get_obj_index( coin_vnum[i] ), num[i] ); 
      obj->To( ch );
      consolidate( obj );
      }
    }

  if( message != NULL ) 
    send( ch, "%s%s.\r\n", message, coin_phrase( num ) );
}


bool remove_coins( char_data* ch, int amount, char* message ) 
{
  obj_data*       obj;
  obj_data*  coin_obj  [ 4 ];
  int           coins  [ 4 ];
  bool           flag  = FALSE;
  int             dum;
  int          number  [] = { 0, 0, 0, 0 };
  int             pos  [ MAX_COIN ];
  int             neg  [ MAX_COIN ];
  int               i;

  vzero( coin_obj, MAX_COIN );
  vzero( coins,    MAX_COIN );
  vzero( number,   MAX_COIN );   

  for( i = 0; i < ch->contents; i++ ) {
    obj = (obj_data*) ch->contents[i];
    for( int j = 0; j < MAX_COIN; j++ ) 
      if( obj->pIndexData->vnum == coin_vnum[j] ) {
        coin_obj[j] = obj; 
        coins[j] = obj->number;
        }
    }
 
  for( i = 0; i < MAX_COIN && amount > 0; i++ ) {
    amount -= coins[i]*coin_value[i];
    number[i] = coins[i];
    }

  if( amount > 0 ) 
    return FALSE;

  amount = -amount;
   
  for( i--; i >= 0; i-- ) {
    dum = amount/coin_value[i];
    amount -= dum*coin_value[i];
    number[i] -= dum;
    }
    
  for( i = MAX_COIN - 1; i >= 0; i-- ) {
    if( number[i] > 0 )
      coin_obj[i]->Extract( number[i] );
    pos[i] = max( 0, number[i] );
    neg[i] = max( 0, -number[i] );
    if( neg[i] != 0 ) {
      if( coin_obj[i] == NULL ) {
        obj = create( get_obj_index( coin_vnum[i] ), neg[i] );
        obj->To( ch );
        consolidate( obj );
        }
      else
        coin_obj[i]->number += neg[i];
      flag = TRUE;
      }
    }

  if( message != NULL ) {
    fsend( ch, "%s%s.\r\n", message, coin_phrase( pos ) );
    if( flag ) 
      send( ch, "You receive%s in change.\r\n", coin_phrase( neg ) );
    }

  return TRUE;
}


void do_split( char_data* ch, char* argument )
{
  int amount;

  if( *argument == '\0' ) {
    send( ch, "What amount do you wish to split?\r\n" );
    return;
    }

  amount = atoi( argument );

  if( amount < 2 ) {
    send( ch, "It is difficult to split anything less than 2 cp.\r\n" );
    return;
    }
 
  if( get_money( ch ) < amount ) {
    send( ch, "You don't have enough coins to split that amount.\r\n" );
    return;
    }

  split_money( ch, amount, TRUE );
}


void split_money( char_data* ch, int amount, bool msg )
{
  /*
  char_data*      gch;
  char_data*    group  = NULL;
  obj_data*       obj;
  obj_data*  coin_obj  [ 4 ];
  int      coins_held  [ 4 ];
  int     coins_split  [ 4 ];
  int           split;
  int           total;
  int               i;
  int         members  = 1;
  bool       anything  = FALSE;
  bool          found;
  char*        phrase;

  if( amount == 0 )
    return;

  for( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room )
    if( gch != ch && is_same_group( gch, ch ) && ( gch->species == NULL
      || !is_set( &gch->status, STAT_PET ) ) && gch->Seen( ch ) ) {
      members++;
      gch->next_list = group;
      group = gch;
      }

  if( members < 2 ) {
    if( msg )
      send( ch, "There is noone here to split the coins with.\r\n" );
    return;
    }
  
  for( i = 0; i < 4; i++ ) {
    coin_obj[i]   = NULL;
    coins_held[i] = 0;
    } 

  for( obj = ch->contents; obj != NULL; obj = obj->next_content )
    for( i = 0; i < 4; i++ ) 
      if( obj->pIndexData->vnum == coin_vnum[i] ) {
        coin_obj[i] = obj; 
        coins_held[i] = obj->number;
        }

  split = amount/members;

  for( gch = group; gch != NULL; gch = gch->next_list ) {
    total = 0;  
    found = FALSE;

    for( i = MAX_COIN-1; i >= 0; i-- ) {
      coins_split[i] = min( ( split-total )/coin_value[i], coins_held[i] );
      if( coins_split[i] != 0 ) {
        total += coin_value[i]*coins_split[i];
        coins_held[i] -= coins_split[i];  
        obj = remove( coin_obj[i], coins_split[i] );
        set_owner( obj, gch, ch );
        put_obj( obj, gch );      
        found = TRUE;
        }
      }

    if( found ) { 
      phrase = coin_phrase( coins_split );
      send( ch, "You give%s to %s.\r\n", phrase, gch );
      send( gch, "%s gives%s to you.\r\n", ch, phrase );
      send( *ch->array, "%s gives%s to %s.\r\n", ch, phrase, gch );
      anything = TRUE;
      }
    }

  if( !anything )
    send( ch, "You lack the correct coins to split that amount.\r\n" );
  */
  return;
}