// Pinkfish
// Started Wed May 30 21:37:15 PDT 2001
inherit "/std/room/furniture/commercial";
#include <money.h>
#include <move_failures.h>
private mapping _money;
private int _cut;
private int _cost;
#define BOARD_TAG "money changer"
void setup() {
set_name( "counter" );
set_short( "money changer counter" );
add_adjective( ({ "money", "changer" } ));
add_alias("changer");
set_long( "A box with a bunch of holes in it, it looks like it will "
"change coins into other types of coins.\n");
set_allowed_positions(({"sitting", "lying", "kneeling", "meditating"}));
set_allowed_room_verbs((["sitting" : "sits" ]));
set_weight(2000);
set_value(240000);
// Minimum bid $1.
add_help_file("money_changer");
set_commercial_size(5);
_cut = 10;
_cost = 400;
_money = ([ ]);
}
/**
* This method changes the money into a specific type of thing.
* @param words the money to change
* @param type what to change it into
*/
int change( string words, string type ) {
int val_index;
int value;
int value_type;
int value_unit;
int value_change;
int value_num;
int i;
string place;
mixed money;
object changed;
object *monies;
mixed *change;
mixed *values;
mixed *money_bits;
place = query_money_place();
if ( !place || ( place == "" ) ) {
place = "default";
}
values = (mixed *)MONEY_HAND->query_values_in( place );
MONEY_OBJECT->set_money_array( values );
val_index = (int)MONEY_OBJECT->find_best_fit( type );
if ( val_index == -1 ) {
return notify_fail( "The coin type \""+ type +
"\" is not legal tender here.\n" );
}
money = (mixed)MONEY_HAND->parse_money( words, this_player(), place );
if ( intp( money ) ) {
switch( money ) {
case NO_MATCH :
return notify_fail( "You do not have \""+ words +"\".\n" );
case NO_MONEY :
return notify_fail( "You can only change money here.\n" );
default :
return notify_fail( "You can only change legal tender.\n" );
}
}
/* Pull out the provincial coins otherwise the player gets ripped off */
if (place != "default") {
monies = MONEY_HAND->filter_legal_tender(money, "default");
if (monies[0]) monies[0]->move(this_player());
if (!monies[1]) {
return notify_fail( "You can only change legal tender.\n" );
}
money = monies[1];
}
//
// The money bits.
//
money_bits = money->query_money_array();
value = (int)money->query_value_in( place );
//
// Check and see if they have any of the type of money which we are trying
// to change to in the money object.
//
i = member_array(values[val_index], money->query_money_array());
if (i != -1) {
value_type = money->query_money_array()[i + 1] * values[val_index + 1];
}
value_unit = (values[val_index + 1] * (100 + _cut)) / 100;
//printf("%O %O %O\n", value_unit, values[val_index + 1], _cut);
//
// Figure out the end value.
//
value_change = (value - value_type) % value_unit;
value_num = (value - value_type) / value_unit;
value = value_num * values[val_index + 1] + value_type;
if ( value < values[ val_index + 1 ] ) {
money->move( this_player() );
return notify_fail( MONEY_HAND->money_string(money->query_money_array(), place) +
" is not even worth one "+ values[ val_index ] +
".\n" );
}
//
// Check and see if they have enough type of that sort of money.
//
if (_money[values[val_index]] < value_num) {
money->move( this_player() );
add_failed_mess("The money changer does not have enough " +
MONEY_HAND->query_main_plural_for(values[val_index]) +
" to pay you.\n");
return 0;
}
_money[values[val_index]] -= value_num;
for (i = 0; i < sizeof(money_bits); i += 2) {
_money[money_bits[i]] += money_bits[i + 1];
}
changed = clone_object( MONEY_OBJECT );
changed->set_money_array( ({ values[ val_index ],
value / values[ val_index + 1 ] }));
change = (mixed *)MONEY_HAND->create_money_array( value_change, place );
for (i = 0; i < sizeof(changed); i += 2) {
_money[change[i]] -= change[i + 1];
}
this_player()->add_succeeded_mess(this_object(),
({ "You changed "+query_multiple_short(money->half_short( 1 ) ) +
" into "+
query_multiple_short( changed->half_short( 1 ) ) +".\n",
"$N $V some money into "+type+".\n" }), ({ }) );
//write( "You get "+ query_multiple_short( (string)money->half_short( 1 ) ) +
//" changed into "+
//query_multiple_short( (string)changed->half_short( 1 ) ) +".\n" );
money->move( "/room/rubbish" );
if ( sizeof( change ) ) {
changed->adjust_money( change );
write( "You were returned "+ (string)MONEY_HAND->money_string( change )
+" in change.\n" );
}
if ( (int)changed->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" );
changed->move( this_object() );
}
return 1;
} /* change() */
string query_main_status(int hint) {
string type;
string place;
int num;
string str;
place = query_money_place();
str = "$I$0=Money Changer:\n";
str += "$I$6= Percentage cut " + _cut + "%\n";
/*
str += "$I$6= Cost per use " +
MONEY_HAND->money_value_string(_cost, place) + "\n";
*/
foreach (type, num in _money) {
str += "$I$6= " + num + " " + type + "\n";
}
return str;
} /* query_main_status() */
/**
* This method sets the ante amounts.
* @param str the amount string
* @param max_bet if it a max or min bet to set
*/
int do_set_cost(string str) {
string place;
int value;
if (!is_allowed(this_player()->query_name())) {
add_failed_mess("You are not allowed to change the paramaters of "
"$D.\n");
return 0;
}
place = query_money_place();
value = MONEY_HAND->value_from_string(str, place);
if (!value) {
add_failed_mess("Unable to parse the string " + str + ".\n");
return 0;
}
_cost = value;
add_succeeded_mess("$N set$s the cost of each use of $D to " +
MONEY_HAND->money_value_string(value, place) + ".\n");
return 1;
} /* do_set_cost() */
/**
* This method sets the ante amounts.
* @param str the amount string
* @param max_bet if it a max or min bet to set
*/
int do_set_cut(int number) {
if (!is_allowed(this_player()->query_name())) {
add_failed_mess("You are not allowed to change the paramaters of "
"$D.\n");
return 0;
}
if (number < 0) {
add_failed_mess("You need to set the cut to a number greator than 0.\n");
return 0;
}
if (number > 500) {
add_failed_mess("You need to set the cut to a number less than 500.\n");
return 0;
}
_cut = number;
add_succeeded_mess("$N set$s the cut for $D to " + _cut + "%.\n");
return 1;
} /* do_set_cut() */
/**
* This method deposits coins into the changer.
* @param str the amount string
* @param max_bet if it a max or min bet to set
*/
int do_deposit(int num, string str) {
mixed* values;
int i;
if (!is_allowed(this_player()->query_name())) {
add_failed_mess("You are not allowed to change the paramaters of "
"$D.\n");
return 0;
}
values = this_player()->query_money_array();
for (i = 0; i < sizeof(values); i += 2) {
if (lower_case(values[i]) == lower_case(str)) {
break;
}
}
//i = member_array(str, values);
if (i >= sizeof(values)) {
add_failed_mess("You do not have any " + str + " to deposit.\n");
return 0;
}
if (values[i + 1] < num) {
add_failed_mess("You do not have " + num + " of " + values[i] +
", you only have " + values[i+1] + ".\n");
return 0;
}
_money[values[i]] += num;
this_player()->adjust_money(-num, values[i]);
add_succeeded_mess("$N deposit$s " + num + " of " + str + " in $D.\n");
return 1;
} /* do_deposit() */
/**
* This method withdraws money from the changer.
* @param str the amount string
* @param max_bet if it a max or min bet to set
*/
int do_withdraw(int num, string str) {
string tmp;
int bing;
if (!is_allowed(this_player()->query_name())) {
add_failed_mess("You are not allowed to change the paramaters of "
"$D.\n");
return 0;
}
foreach (tmp, bing in _money) {
if (lower_case(str) == lower_case(tmp)) {
if (num > bing) {
add_failed_mess("The $D does not have " +
num + " of " + tmp + " it only has " +
bing + ".\n");
str = tmp;
}
}
}
if (!_money[str]) {
add_failed_mess("You do not appear to have any " + str + " in $D.\n");
return 0;
}
_money[str] -= num;
if (!_money[str]) {
map_delete(_money, str);
}
this_player()->adjust_money(num, str);
add_succeeded_mess("$N withdraw$s " + num + " of " + str + " from $D.\n");
return 1;
} /* do_deposit() */
void init() {
commercial::init();
add_command("change", "<string'money'> into <string'type'> on <direct:object>",
(: change($4[0], $4[1]) :));
if (environment()->is_allowed(this_player()->query_name())) {
add_command("set", "cut <number'percentage'> on <direct:object>",
(: do_set_cut($4[0]) :));
add_command("deposit", "<number> of <string'type'> on <direct:object>",
(: do_deposit($4[0], $4[1]) :));
add_command("withdraw", "<number> of <string'type'> on <direct:object>",
(: do_withdraw($4[0], $4[1]) :));
/*
add_command("set", "cost of use <string'amount'> on <direct:object>",
(: do_set_cost($4[0]) :));
*/
}
} /* init() */
/** @ignore yes */
mapping query_dynamic_auto_load() {
mapping map;
map = commercial::query_dynamic_auto_load();
add_auto_load_value(map, BOARD_TAG, "cut", _cut);
add_auto_load_value(map, BOARD_TAG, "money", _money);
add_auto_load_value(map, BOARD_TAG, "cost", _cost);
return map;
} /* query_dynamic_auto_load() */
/** @ignore yes */
void init_dynamic_arg(mapping map, object player) {
commercial::init_dynamic_arg(map, player);
_cut = query_auto_load_value(map, BOARD_TAG, "cut");
_money = query_auto_load_value(map, BOARD_TAG, "money");
_cost = query_auto_load_value(map, BOARD_TAG, "cost");
} /* init_dynamic_arg() */