/**
* This is the bank inheritable. It handles all the bank transactions
* and other such exciting stuff.
* @author Pinkfish
*/
#include <money.h>
#include <move_failures.h>
nosave inherit "/std/room/furniture/commercial";
nosave inherit "/std/shops/inherit/bank_master";
#define OBJECT_TAG "bank master"
private nosave string _place;
void create() {
add_help_file("bank_master");
commercial::create();
bank_master::create();
set_commercial_name("bank");
} /* create() */
/**
* This method does the actual save.
*/
void event_save(object ob) {
environment()->event_save(ob);
} /* event_save() */
mixed *stats() {
return commercial::stats() +
bank_master::stats();
} /* stats() */
/**
* Find the object associated with the bank.
* @param franchise the franchise to find the object for
* @return the bank object
*/
object find_bank_object(string franchise) {
object* obs;
object room;
room = load_object(franchise);
if (room->query_bank()) {
return room;
}
obs = filter(room->find_commercial_items(query_commercial_name()),
(: $1->query_bank_name() == query_bank_name() :));
if (sizeof(obs)) {
return obs[0];
}
return 0;
} /* find_bank_object() */
/**
* Show a list of all the franchises.
*/
int do_list_franchises() {
string franchise;
int pos;
object bank_ob;
string ret;
string place;
if (!sizeof(BANK_HANDLER->query_franchises(query_bank_name()))) {
add_failed_mess("This bank has no franchises.\n");
return 0;
}
place = query_money_place();
ret = "Franchises:\n";
foreach (franchise in BANK_HANDLER->query_franchises(query_bank_name())) {
bank_ob = find_bank_object(franchise);
ret += sprintf("$I$6= %c %s Balance %s (cost per month %s)\n",
pos + 'A', franchise->the_short(),
MONEY_HAND->money_value_string(bank_ob->query_total_difference(), place),
MONEY_HAND->money_value_string(BANK_HANDLER->query_bank_franchise_cost_per_month(query_bank_name(), franchise), place));
pos++;
}
write("$P$Franchises$P$" + ret);
return 1;
} /* do_list_franchises() */
/**
* Set how much it costs to open a franchise.
*/
int do_set_franchise_cost(string cost) {
int amount;
string place;
place = query_money_place();
amount = MONEY_HAND->value_from_string(cost, place);
if (amount <= 0) {
add_failed_mess("Unknown amount " + cost + ".\n");
return 0;
}
BANK_HANDLER->set_bank_default_cost_to_open(query_bank_name(), amount);
add_succeeded_mess("$N set$s the cost to open a franchise to " +
MONEY_HAND->money_value_string(BANK_HANDLER->query_default_cost_to_start(query_bank_name()), place) + "\n");
return 1;
} /* do_set_franchise_cost() */
/**
* Set how much it costs to open a franchise.
*/
int do_set_default_monthly_cost(string cost) {
int amount;
string place;
place = query_money_place();
amount = MONEY_HAND->value_from_string(cost, place);
if (amount <= 0) {
add_failed_mess("Unknown amount " + cost + ".\n");
return 0;
}
BANK_HANDLER->set_bank_default_cost_per_month(query_bank_name(), amount);
add_succeeded_mess("$N set$s the cost to open a franchise to " +
MONEY_HAND->money_value_string(BANK_HANDLER->query_default_cost_to_start(query_bank_name()), place) + "\n");
return 1;
} /* do_set_default_cost() */
/**
* This method sets the new name of the bank.
* @param new_name the new bank name
*/
int do_set_main_bank_name(string new_name) {
string* names;
string name;
if (query_bank_name()) {
add_failed_mess("This bank already has a name.\n");
return 0;
}
//
// Check and see if the name is valid and not already used.
//
names = BANK_HANDLER->query_banks();
foreach (name in names) {
if (lower_case(name) == lower_case(new_name)) {
add_failed_mess("There is already a bank called " +
name + ".\n");
return 0;
}
}
write("Do you really want to set the bank name to " + new_name +
" (Make sure you have correct capitalisation)? ");
input_to("check_bank_name", 0, new_name);
add_succeeded_mess("");
return 1;
} /* do_set_main_bank_name() */
/** @ignore yes */
void check_bank_name(string response, string new_name) {
if (!strlen(response) || lower_case(response)[0] != 'y') {
write("Ok, aborting.\n");
return ;
}
write("You set the bank name to " + new_name + ".\n");
BANK_HANDLER->create_new_bank(new_name, file_name(environment()));
::set_bank_name(new_name);
} /* set_bank_name() */
/**
* This method sets the cut
* @param percent the cut percentage
*/
int do_set_cut(int percent) {
if (!is_allowed(this_player()->query_name())) {
add_failed_mess("You are not allowed to change the paramaters of "
"$D.\n");
return 0;
}
if (percent < 0) {
add_failed_mess("You cannot set the cut less than 0.\n");
return 0;
}
if (percent > 100) {
add_failed_mess("You cannot set the cut to greator than 100%.\n");
return 0;
}
set_percentage(percent);
add_succeeded_mess("$N set$s the cut to " + percent + "% on $D.\n");
return 1;
} /* do_set_cut() */
/**
* This method sets the ante amounts.
* @param str the amount string
*/
int do_set_open_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;
}
set_account_cost(value);
add_succeeded_mess("$N set$s the account open cost to " +
MONEY_HAND->money_value_string(value, place) + " on $D.\n");
return 1;
} /* do_set_open_cost() */
/**
* This method allows you to change the cost per month to the specific
* franchise.
* @param id the franchise id
* @param amount the new amount to cost per month
*/
int do_set_franchise_cost_per_month(string id, string amount) {
string *franchises;
int id_num;
int amt;
id = lower_case(id);
if (strlen(id) != 1) {
add_failed_mess("Must be one letter.\n");
return 0;
}
franchises = BANK_HANDLER->query_franchises(query_bank_name());
id_num = id[0] - 'a';
if (id_num < 0 || id_num >= sizeof(franchises)) {
add_failed_mess("The id of the franchises must be between 'A' and '" +
sprintf("%c", 'A' + sizeof(franchises) - 1) + ".\n");
return 0;
}
amt = MONEY_HAND->value_from_string(amount, query_money_place());
if (amt <= 0) {
add_failed_mess("The amount " + amount + " is invalid.\n");
return 0;
}
BANK_HANDLER->set_bank_franchise_cost_per_month(query_bank_name(),
franchises[id_num], amt);
add_succeeded_mess(({ "You set the cost per month for the franchise " +
franchises[id_num]->query_address() + " to " +
MONEY_HAND->money_value_string(amt, query_money_place()) + ".\n",
"" }));
return 1;
} /* do_set_franchise_cost_per_month() */
/** @ignore yes */
string query_main_status(int hints) {
string ret;
string place;
place = query_money_place();
ret = "$I$0=" + the_short() + ":\n";
ret += "$I$6= Bank Name : " +
query_bank_name() + "\n";
ret += "$I$6= Revenue : " +
MONEY_HAND->money_value_string(query_revenue(), place) + "\n";
ret += "$I$6= Cost to buy franchise : " +
MONEY_HAND->money_value_string(BANK_HANDLER->query_bank_default_cost_to_open(query_bank_name()), place) + "\n";
if (hints) {
ret += "$I$9= Hint: set buy franchise cost <amount> on <object>\n";
}
ret += "$I$6= Franchise cost per month : " +
MONEY_HAND->money_value_string(BANK_HANDLER->query_bank_default_cost_per_month(query_bank_name()), place) + "\n";
if (hints) {
ret += "$I$9= Hint: set default franchise monthly cost <amount> on <object>\n";
}
ret += "$I$6= Percentage : " +
query_percentage() + "%\n";
if (hints) {
ret += "$I$9= Hint: set percentage <number> on <counter>\n";
}
ret += "$I$6= Cost to open account : " +
MONEY_HAND->money_value_string(query_account_cost(), place) + "\n";
if (hints) {
ret += "$I$9= Hint: set account cost <amount> on <object>\n";
}
ret += "$I$6= Number of Franchises : " +
sizeof(BANK_HANDLER->query_franchises(query_bank_name())) + "\n";
return ret;
} /* query_main_status() */
mapping query_dynamic_auto_load() {
mapping map;
map = ::query_dynamic_auto_load();
add_auto_load_value(map, OBJECT_TAG, "bank", query_bank_name());
add_auto_load_value(map, OBJECT_TAG, "open", query_account_cost());
add_auto_load_value(map, OBJECT_TAG, "percentage", query_percentage());
add_auto_load_value(map, OBJECT_TAG, "difference", query_total_difference());
return map;
} /* query_dynamic_auto_load() */
void init_dynamic_arg(mapping map, object player) {
commercial::init_dynamic_arg(map, player);
set_bank_name(query_auto_load_value(map, OBJECT_TAG, "bank"));
set_account_cost(query_auto_load_value(map, OBJECT_TAG, "open"));
set_percentage(query_auto_load_value(map, OBJECT_TAG, "percentage"));
set_total_difference(query_auto_load_value(map, OBJECT_TAG, "difference"));
} /* init_dyanmic_arg() */
void init() {
commercial::init();
bank_master::init();
if (is_allowed(this_player()->query_name())) {
add_command("set", "bank name <string'name'> on <direct:object>",
(: do_set_main_bank_name($4[0]) :));
add_command("set", "buy franchise cost <string'cost'> on <direct:object>",
(: do_set_franchise_cost($4[0]) :));
add_command("set", "franchise monthly cost <string'cost'> on <direct:object>",
(: do_set_default_monthly_cost($4[0]) :));
add_command("set", "percentage <number> on <direct:object>",
(: do_set_cut($4[0]) :));
add_command("set", "account cost <string'open cost'> on <direct:object>",
(: do_set_open_cost($4[0]) :));
add_command("set", "franchise monthly cost <string'cost'> for <string'franchise id'> on <direct:object>",
(: do_set_franchise_cost_per_month($4[1], $4[0]) :));
add_command("list", "franchises on <direct:object>",
(: do_list_franchises :));
}
} /* init() */