/**
* 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 "/std/room/basic_room";
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; }
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;
smallest = MONEY_HAND->smallest_value_in( places[ i ] );
if (value % smallest != 0) value += smallest - (value % smallest);
list += (string)MONEY_HAND->money_value_string( value, places[ i ] );
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] <string'" + implode(keys(exchanges), "|") +
"'> with <indirect:object:me>", (: 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 value;
int smallest;
object thing;
object money;
mixed *change;
mixed *monies;
mixed *no_value;
string word;
// debug_printf( "%O, %O, %O\n", things, args, pattern );
change = ({ });
foreach (thing in things) {
if (thing->query_property("money")) {
change = MONEY_HAND->merge_money_arrays(change,
thing->query_money_array());
#ifdef USE_VAULT
MONEY_VAULT->add_to_list(thing);
#else
thing->move("/room/rubbish");
#endif
}
}
if (sizeof(change) == 0) {
return notify_fail("You can only use money to buy currency here. "
"Sorry.\n");
}
if (undefinedp(exchanges[country])) {
foreach (word in keys(exchanges)) {
if (lower_case(country) == lower_case(word)) {
country = word;
break;
}
}
if (country != word) {
add_failed_mess("You cannot exchange that currency here. Only " +
query_multiple_short(keys(exchanges)) + " currency can be "
"purchased at this shop.\n");
this_player()->adjust_money(change);
return 0;
}
}
if (country == place) {
this_player()->adjust_money(change);
return notify_fail("You cannot buy currency from " + country +
" here, since you're currently in " + country + ".\n");
}
monies = MONEY_HAND->filter_legal_money_to_array(change, place);
no_value = monies[1];
if (sizeof(monies[0]) != 0 && place != "default") {
monies = MONEY_HAND->filter_legal_money_to_array(monies[0], "default");
if (sizeof(monies[0]) != 0)
no_value = MONEY_HAND->merge_money_arrays(no_value, monies[0]);
monies[0] = monies[1];
}
if (sizeof(no_value) != 0) {
this_player()->adjust_money(no_value);
write("Sorry, but you cannot use " +
MONEY_HAND->money_string(no_value) + " to buy currency here.\n");
}
if (sizeof(monies[0]) == 0) {
return notify_fail("Sorry, but you didn't offer any acceptable money "
"to buy currency.\n");
}
value = (MONEY_HAND->query_total_value(monies[0], place) *
exchanges[country][0]) / 100;
smallest = MONEY_HAND->smallest_value_in(country);
if (value % smallest != 0) value += smallest - (value % smallest);
change = MONEY_HAND->create_money_array(value, country);
if (sizeof(change) == 0) {
this_player()->adjust_money(monies[0]);
return notify_fail("Sorry, but " +
MONEY_HAND->money_string(monies[0]) + " is not worth anything "
"in " + country + ".\n");
}
write("OK, you bought "+ MONEY_HAND->money_string(change) + " with " +
MONEY_HAND->money_string(monies[0]) + ".\n");
#ifdef USE_VAULT
money = MONEY_VAULT->get_money_ob();
#else
money = clone_object(MONEY_OBJECT);
#endif
money->set_money_array(change);
if (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());
}
say(this_player()->one_short() + " exchanges some currency.\n");
return 1;
} /* do_buy() */
int sell(object *things) {
int value;
int test_val;
int first;
string *places;
string a_place;
object thing;
object money;
mixed *monies;
mixed *change;
mixed *m_array_a;
mixed *m_array_b;
mixed *m_array_c;
m_array_a = ({ });
foreach (thing in things) {
if (thing->query_property("money")) {
m_array_a = MONEY_HAND->merge_money_arrays(m_array_a,
thing->query_money_array());
#ifdef USE_VAULT
MONEY_VAULT->add_to_list(thing);
#else
thing->move("/room/rubbish");
#endif
}
}
if (sizeof(m_array_a) == 0) {
return notify_fail("You can only sell currency here. Sorry.\n");
}
places = m_indices(exchanges);
m_array_b = ({ });
m_array_c = ({ });
first = 1;
foreach (a_place in places) {
monies = MONEY_HAND->filter_legal_money_to_array(m_array_a, a_place);
m_array_a = monies[1];
if (sizeof(monies[0]) != 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 (first && a_place != "default") {
monies = MONEY_HAND->filter_legal_money_to_array(monies[0], "default");
if (sizeof(monies[0]) != 0)
m_array_c = MONEY_HAND->merge_money_arrays(m_array_c, monies[0]);
monies[0] = monies[1];
first = 0;
}
test_val = MONEY_HAND->query_total_value(monies[0], a_place) *
exchanges[a_place][1] / 100;
if (test_val) {
value += test_val;
m_array_b = MONEY_HAND->merge_money_arrays(m_array_b, monies[0]);
}
else
m_array_c = MONEY_HAND->merge_money_arrays(m_array_c, monies[0]);
}
if (sizeof(m_array_a) == 0)
break;
}
if (sizeof(m_array_c) != 0)
m_array_a = MONEY_HAND->merge_money_arrays(m_array_a, m_array_c);
if (sizeof(m_array_a) != 0) {
write("Sorry, but you cannot sell " +
MONEY_HAND->money_string(m_array_a) + " here.\n");
this_player()->adjust_money(m_array_a);
}
if (sizeof(m_array_b) == 0) {
return notify_fail( "Sorry, but you aren't offering to sell any "
"acceptable coinage.\n");
}
change = MONEY_HAND->create_money_array(value, place);
if (sizeof(change) == 0) {
this_player()->adjust_money(m_array_b);
return notify_fail("Sorry, but " +
MONEY_HAND->money_string(m_array_b) + " is not "
"worth anything in " + place + ".\n");
}
write("OK, you sold " + MONEY_HAND->money_string(m_array_b) + " for " +
MONEY_HAND->money_string(change) + ".\n");
#ifdef USE_VAULT
money = MONEY_VAULT->get_money_ob();
#else
money = clone_object(MONEY_OBJECT);
#endif
money->set_money_array(change);
if (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());
}
say(this_player()->one_short() + " exchanges some currency.\n");
return 1;
} /* sell() */
int list() {
write( exchanges_list() +"\n" );
return 1;
} /* list() */