/**
* This is the standard money changer inheritable.
* @author Pinkfish
* @change Deutha
* Extensive changes to make it work with the new currency system.
*/
#include <money.h>
#include <move_failures.h>
inherit ROOM_OBJ;
int standard, buy_only;
string place;
mapping exchanges;
int do_buy(object *obs, string country);
int query_standard() { return standard; }
void set_standard( int number ) { standard = number; }
int query_buy_only() { return buy_only; }
void set_buy_only() { buy_only = 1; }
string query_place() { return place; }
void set_place( string word ) { place = word; }
mapping query_exchanges() { return exchanges; }
void set_exchanges( mapping map ) { exchanges = map; }
/* Should be in the money handler, really... */
int smallest_in( string place ) {
int i, smallest;
mixed *values;
values = (mixed *)MONEY_HAND->query_values_in( place );
for ( i = 1; i < sizeof( values ); i += 2 )
if ( !smallest || ( values[ i ] < smallest ) )
smallest = values[ i ];
return smallest;
} /* smallest_in() */
string exchanges_list() {
int i, value, smallest;
string list, *places;
if ( !sizeof( exchanges ) )
return "There are no exchanges to be made here.";
list = "";
places = keys( exchanges );
for ( i = 0; i < sizeof( places ); i++ ) {
list += places[ i ] +":\n $I$+20,+10="+
(string)MONEY_HAND->money_value_string( standard, place ) +
" will buy: ";
value = ( exchanges[ places[ i ] ][ 0 ] * standard ) / 100;
list += (string)MONEY_HAND->money_value_string( value, places[ i ] );
smallest = smallest_in( places[ i ] );
while ( ( exchanges[ places[ i ] ][ 1 ] * value ) / 100 < standard )
value += smallest;
if ( buy_only ) {
list += ".$I$-20,-10=";
if ( i < sizeof( places ) - 1 )
list += "\n";
} else {
list += ";$I$-20,-10=\n$I$+20,+10= for "+
(string)MONEY_HAND->money_value_string( standard,
place ) +", sell: ";
value = ( 100 * standard ) / exchanges[ places[ i ] ][ 1 ];
list += (string)MONEY_HAND->money_value_string( value,
places[ i ] ) +".$I$-20,-10=";
if ( i < sizeof( places ) - 1 )
list += "\n";
}
}
return list;
} /* exchanges_list() */
void create() {
do_setup++;
::create();
do_setup--;
standard = 100;
place = "default";
exchanges = ([ ]);
if ( !do_setup ) {
this_object()->setup();
this_object()->reset();
}
} /* create() */
void init() {
::init();
add_command("buy", "[from] {" + implode(keys(exchanges), "|") +
"} with <indirect:object>", (: do_buy($1, $4[0]) :));
if ( !buy_only ){
add_command("sell" ,"<indirect:object:me'stuff'>",
(:this_object()->sell($1):));
}
add_command("list", "", (:this_object()->list():));
} /* init() */
int do_buy(object *things, string country) {
int i, value;
object store, money, *monies;
mixed *change;
if ( country == place ) {
return notify_fail( "You cannot buy currency from "+ country +" here, "+
"since you're currently in "+ country +".\n" );
}
store = clone_object( "/std/container" );
for ( i = 0; i < sizeof( things ); i++ )
if ( things[ i ]->query_property( "money" ) )
things[ i ]->move( store );
if ( !sizeof( all_inventory( store ) ) ) {
store->dest_me();
return notify_fail( "You can only use money to buy currency here. "+
"Sorry.\n" );
}
monies = (object *)MONEY_HAND->filter_legal_tender( all_inventory(
store )[ sizeof( all_inventory( store ) ) - 1 ], place );
store->dest_me();
if ( monies[ 1 ] ) {
write( "Sorry, but you cannot use "+ (string)monies[ 1 ]->short() +" to "+
"buy currency here.\n" );
monies[ 1 ]->move( this_player() );
}
if ( !monies[ 0 ] ) {
return notify_fail( "Sorry, but you didn't offer any acceptable money "+
"to buy currency.\n" );
}
value = ( (int)monies[ 0 ]->query_value_in( place ) *
exchanges[ country ][ 0 ] ) / 100;
change = (mixed *)MONEY_HAND->create_money_array( value, country );
if ( !sizeof( change ) ) {
monies[ 0 ]->move( this_player() );
return notify_fail( "Sorry, but "+ (string)monies[ 0 ]->short() +" is "+
"not worth anything in "+ country +".\n" );
}
write( "Okay, you bought "+ (string)MONEY_HAND->money_string( change ) +
" with "+ (string)MONEY_HAND->money_string( (mixed *)monies[ 0 ]->
query_money_array() ) +".\n" );
monies[ 0 ]->dest_me();
money = clone_object( MONEY_OBJECT );
money->set_money_array( change );
if ( (int)money->move( this_player() ) != MOVE_OK ) {
write( "Unfortunately, you're too heavily burdened to accept all that "+
"money, so it's put on the table for you.\n" );
money->move( this_object() );
}
return 1;
} /* do_buy() */
int sell( object* things ) {
int i;
int value;
int test_val;
string *places;
object store_a;
object store_b;
object money;
object *monies;
mixed *change;
store_a = clone_object( "/std/container" );
for ( i = 0; i < sizeof( things ); i++ ) {
if ( things[ i ]->query_property( "money" ) ) {
things[ i ]->move( store_a );
}
}
if ( !sizeof( all_inventory( store_a ) ) ) {
store_a->dest_me();
return notify_fail( "You can only sell currency here. Sorry.\n" );
}
places = m_indices( exchanges );
store_b = clone_object( "/std/container" );
for ( i = 0; i < sizeof( places ); i++ ) {
monies = (object *)MONEY_HAND->filter_legal_tender( all_inventory(
store_a )[<1], places[ i ] );
if (monies[1]) monies[1]->move(store_a);
test_val = 0;
/* OK, we need to pull off the provincial coins because they have a
value of 0 in any other zone, so the player gets ripped off
if they do "sell coins" and they have a mixture of provincial
and non-provincial coinage. Got that? */
if (monies[0] && places[i] != "default") {
monies = MONEY_HAND->filter_legal_tender(monies[0], "default");
money = monies[0];
monies[0] = monies[1];
monies[1] = money;
}
if (monies[0])
test_val = monies[0]->query_value_in(places[i]) *
exchanges[places[i]][1] / 100;
if (test_val) {
value += test_val;
monies[ 0 ]->move( store_b );
}
if ( monies[ 1 ] )
monies[ 1 ]->move( store_a );
else
break;
}
if ( money = present( MONEY_ALIAS, store_a ) ) {
write( "Sorry, but you cannot sell "+ (string)money->short() +" here.\n" );
money->move( this_player() );
}
store_a->dest_me();
if ( !( money = present( MONEY_ALIAS, store_b ) ) ) {
store_b->dest_me();
return notify_fail( "Sorry, but you aren't offering to sell any "+
"acceptable coinage.\n" );
}
change = (mixed *)MONEY_HAND->create_money_array( value, place );
if ( !sizeof( change ) ) {
money->move( this_player() );
store_b->dest_me();
return notify_fail( "Sorry, but "+ (string)money->short() +" is not "+
"worth anything in "+ place +".\n" );
}
write( "Okay, you sold "+ (string)MONEY_HAND->money_string(
(mixed *)money->query_money_array() ) +" for "+
(string)MONEY_HAND->money_string( change ) +".\n" );
store_b->dest_me();
money = clone_object( MONEY_OBJECT );
money->set_money_array( change );
if ( (int)money->move( this_player() ) != MOVE_OK ) {
write( "Unfortunately, you're too heavily burdened to accept all that "+
"money, so it's put on the table for you.\n" );
money->move( this_object() );
}
return 1;
} /* sell() */
int list() {
write( exchanges_list() +"\n" );
return 1;
} /* list() */