/
LIB3/
LIB3/D/ADMIN/
LIB3/D/ADMIN/OBJ/
LIB3/D/ADMIN/ROOM/W/
LIB3/D/HOME/
LIB3/D/HOME/CITY/ARENA/
LIB3/D/HOME/CITY/ITEMS/
LIB3/D/HOME/CITY/POSTOFFI/
LIB3/DOC/
LIB3/GLOBAL/SPECIAL/
LIB3/GLOBAL/VIRTUAL/
LIB3/NET/
LIB3/NET/CONFIG/
LIB3/NET/DAEMON/CHARS/
LIB3/NET/GOPHER/
LIB3/NET/INHERIT/
LIB3/NET/OBJ/
LIB3/NET/SAVE/
LIB3/NET/VIRTUAL/
LIB3/OBJ/B_DAY/
LIB3/OBJ/HANDLERS/TERM_TYP/
LIB3/PLAYERS/B/
LIB3/PLAYERS/N/
LIB3/ROOM/
LIB3/SAVE/
LIB3/SAVE/BOARDS/
LIB3/SAVE/ENVIRON/
LIB3/SAVE/POST/
LIB3/STD/COMMANDS/SHADOWS/
LIB3/STD/CREATOR/
LIB3/STD/DOM/
LIB3/STD/EFFECTS/
LIB3/STD/EFFECTS/HEALING/
LIB3/STD/EFFECTS/OTHER/
LIB3/STD/EFFECTS/POISONS/
LIB3/STD/ENVIRON/
LIB3/STD/GUILDS/
LIB3/STD/LIQUIDS/
LIB3/STD/ROOM/
LIB3/STD/TRIGGER/SHADOW/
LIB3/W/
LIB3/W/BANNOR/
LIB3/W/NEWSTYLE/
#pragma save_binary

inherit "/std/object";
#include "move_failures.h"
#include "money.h"


mixed  *money_array;
static int dont_join;

void    create()
{
    money_array = ({ });
    ::create();
    set_name( "coin" );
    add_alias( "Some Money For Me" );
    add_plural( "coins" );
    set_main_plural( "coins" );
    add_property( "determinate", "" );
    add_property( "no one", 1 );
    add_property( "money", 1 );
}

/*
   void init() {
   add_action("do_help", "help");
   }
 */

int     do_help( string str )
{
    mixed * values;
    int     i;

    if( !str || str != "money" )
	return 0;
    write( "Money values.\n" );
    values = (mixed *)MONEY_HAND->query_values();
    str = "";
    for( i = 0; i < sizeof( values ); i += 2 )
	str += sprintf( "%10-s : %4d\n", values[ i ], values[ i + 1 ] );
    printf( "%#-*s\n", this_player()->query_cols(), str );
    return 1;
}

varargs int adjust_money( mixed amt, string type )
{
    int     i, j, val;

    if( pointerp( amt ) )
    {
	for( i = 0; i < sizeof( amt ); i += 2 )
	    adjust_money( amt[ i + 1 ], amt[ i ] );
	return 1;
    }
    if( !stringp( type ) || !intp( amt ) )
	return 0;
    if( (i = member_array( type, money_array )) == -1 )
    {
	add_adjective( type );
	/* order - highest value to the left of money_array */
	for( i = 0; i < sizeof( money_array ); i += 2 )
	{
	    val = (int)MONEY_HAND->query_value( money_array[ i ] );
	    if( (int)MONEY_HAND->query_value( type ) > val )
		break;
	}

	money_array = money_array[ 0..(i - 1) ] + ({ type, amt }) +
	    money_array[ i..sizeof( money_array ) ];
    }
    else
    {
	money_array[ i + 1 ] += amt;
	if( money_array[ i + 1 ] <= 0 )
	{
	    remove_adjective( type );
	    money_array = delete( money_array, i, 2 );
	    return 0;
	}
    }
    return money_array[ i + 1 ];
}

mixed * query_money_array()
{
    return money_array;
}

void    set_money_array( mixed *arr )
{
    int     i;

    money_array = arr;
    adjectives = ({ });		/* clear them... */
    for( i = 0; i < sizeof( money_array ); i += 2 )
	add_adjective( money_array[ i ] );
}

string *half_short()
{
    string *retval;
    int     i;

    retval = ({ });
    for( i = 0; i < sizeof( money_array ); i += 2 )
	if( money_array[ i + 1 ] > 0 )
	    if( this_player() != environment() && money_array[ i + 1 ] > 10 )
		retval += ({ "Some " + money_array[ i ] });
	    else
		retval += ({ money_array[ i + 1 ] + " " +
			     money_array[ i ] });
    return retval;
}

string short( int dark )
{
    mixed   retval;

    retval = half_short();
    if( !sizeof( retval ) )
	return 0;
    if( sizeof( retval ) == 1 )
    {
	if( money_array[ sizeof( money_array ) - 1 ] == 1 )
	    return retval[ 0 ] + " coin";
	return retval[ 0 ] + " coins";
    }
    return implode( retval[ 0..sizeof( retval ) - 2 ], ", " ) +
	" and " + retval[ sizeof( retval ) - 1 ] + " coins";
}

/*
   string *pretty_short(int dark) {
   return half_short();
   }
 */
object  new_money_object( int num, string type )
{
    int     i;
    object  ob;

    if( !sizeof( money_array ) )
	return 0;
    if( !type )
	i = 0;
    else
	if( (i = member_array( type, money_array )) == -1 )
	    return 0;
    if( num > money_array[ i + 1 ] )
	num = money_array[ i + 1 ];
    ob = clone_object( MONEY_OBJECT );
    ob->adjust_money( num, type );
    money_array[ i + 1 ] -= num;
    if( money_array[ i + 1 ] <= 0 )
    {
	remove_adjective( type );
	money_array = delete( money_array, i, 2 );
    }
    return ob;
}

varargs int move( mixed dest, mixed messin, mixed messout )
{
    mixed   i;
    int     j;
    object  ob, mon;

    j = (int)::move( dest, messin, messout );
    if( j != MOVE_OK )
	return j;
    if( objectp( dest ) )
	ob = dest;
    else
    {
	ob = find_object( dest );
	if( !ob )
	{
	    call_other( ob, "??" );
	    ob = find_object( dest );
	}
    }
    remove_alias( "Some Money For Me" );
    remove_call_out( "move" );
    if( ob && (mon = present( "Some Money For Me", ob )) && !dont_join )
    {
	for( j = 0; j < sizeof( money_array ); j += 2 )
	    mon->adjust_money( money_array[ j + 1 ], money_array[ j ] );
	dont_join = 1;
	move( "/room/void" );
	call_out( "dest_me", 0 );
	return MOVE_OK;
    }
    add_alias( "Some Money For Me" );
    return MOVE_OK;
}

object  query_parse_id( mixed *arr )
{
    int     i, j, num;
    string  s1, s2, *bit;
    object  ob;

    if( arr[ 0 ] == 0 )
    {
	bit = explode( arr[ 1 ], " " );
	if( bit[ sizeof( bit ) - 1 ] != "coins" )
	    if( environment() != this_player() && sizeof( money_array ) )
		return this_object();
	    else
		return 0;
	if( sizeof( bit ) == 1 )
	    return this_object();
	i = member_array( bit[ 0 ], money_array );
	if( i == -1 )
	    return 0;
	num = money_array[ i + 1 ];
	if( !num )
	    return 0;
	s1 = money_array[ i ];
	money_array = delete( money_array, i, 2 );
	ob = clone_object( MONEY_OBJECT );
	ob->set_money_array( ({ s1, num }) );
	ob->do_move_call_out( environment() );

	return ob;
    }
    /* assume if they are after a particular one they are not interested in
     * us... */
    if( arr[ 0 ] <= 0 || !sizeof( money_array ) )
	return 0;
    i = -1;
    for( j = 0; j < sizeof( money_array ); j += 2 )
	if( sscanf( arr[ 1 ], "%s" + money_array[ j ] + "%s", s1, s2 ) )
	    i = j;
    if( i == -1 )
    {
	i = member_array( "copper", money_array );
	if( i == -1 )
	    i = 0;
    }
    if( arr[ 0 ] > money_array[ i + 1 ] )
	num = money_array[ i + 1 ];
    else
	num = arr[ 0 ];
    if( !num )
	return 0;
    money_array[ i + 1 ] -= num;
    arr[ 0 ] -= num;
    ob = clone_object( MONEY_OBJECT );
    ob->set_money_array( ({ money_array[ i ], num }) );
    ob->do_move_call_out( environment() );
    return ob;
}

/* you cannot sell money... */
int     do_not_sell()
{
    return 1;
}
void    do_move_call_out( object ob )
{
    call_out( "move", 0, ob );
}

int     query_value()
{
    return( int ) MONEY_HAND->query_total_value( money_array );
}

int     query_number_coins()
{
    int     i, tot;

    if( !sizeof( money_array ) )
	return 0;
    for( i = 1; i < sizeof( money_array ); i += 2 )
	tot += money_array[ i ];
    return tot;
}