/* -*- LPC -*- */
/*
* $Locker: $
* $Id: bank_handler.c,v 1.17 2003/05/07 23:08:10 ceres Exp $
*
*/
/**
* Keep track of each banks data.
* @change 12-11-97 Pinkfish
* Removed the player_name variable. Made a couple of the functions
* private
*
* @change 21-11-97 Terano
* Changed the get_data_file function so that if there is no data file
* for a player, it calls init_data
*/
#define RESTORE_PATH "/save/bank_accounts/"
//#define LOGGING
#define CHEAT_THRESHOLD 200000
class franchise {
string office;
int cost_per_month;
int cost_per_new_account;
}
class bank_data {
string master_office;
class franchise* franchises;
int cost_to_start;
int default_cost_per_month;
int default_cost_per_new_account;
}
private mapping accounts;
private nosave mapping _banks;
void do_cheat_check(string, string, int, string, int);
void create() {
string str;
_banks = ([ ]);
str = unguarded((: read_file, RESTORE_PATH + "bank_data.o" :));
if (str) {
_banks = restore_variable(str);
}
} /* create() */
private void save_banks() {
unguarded((: write_file, RESTORE_PATH + "bank_data.o",
save_variable(_banks), 1 :));
} /* save_banks() */
private void init_data( string word ) {
accounts = ([ ]);
} /* init_data() */
/**
* Start up the system by restoreing the players data.
* @param word the name of the player being restored
*/
int get_data_file( string name ) {
int success;
success = unguarded((: restore_object, RESTORE_PATH+
name[0..0]+"/"+name :));
if(!success) {
init_data(name);
return success;
}
return 1;
} /* get_data_file() */
/**
* Save the current data file to disk.
* @param word the name of the player being saved
*/
private void save_data_file( string name ) {
if(!unguarded((: save_object, RESTORE_PATH+name[0..0]+"/"+name :)))
debug_printf("Problem saving " + RESTORE_PATH+name[0..0]+"/"+name);
} /* save_data_file() */
/**
* Find out how much a player has at a given bank.
* @param word the name of the player
* @param bank_name the name of the bank
* @return the current balance, -1 on failure
*/
int query_account( string word, string bank_name ) {
get_data_file( word );
if ( !accounts ) {
return -1;
}
if ( member_array( bank_name, m_indices( accounts ) ) == -1 ) {
return -1;
}
return accounts[ bank_name ];
} /* query_account() */
/**
* Change the amount of money a player has at a given bank.
* @param name the name of the player
* @param bank_name the name of the bank
* @param amount the amount to change the balance by
*/
void adjust_account( string name, string bank_name, int amount ) {
int before;
get_data_file( name );
before = accounts[ bank_name ];
accounts[bank_name] += amount;
if ( accounts[ bank_name ] < 0 ) {
accounts = m_delete( accounts, bank_name );
}
do_cheat_check(name, bank_name, amount, "by", before);
save_data_file( name );
return;
} /* adjust_account() */
/**
* Sets the balance at a certain bank to the specificed amount.
* @param name the name of the player
* @param bank_name the name of the bank
* @param amount the amount to set the bank to.
* Query the accounts a player has.
*
* @param player the name of the player
*/
void set_account( string name, string bank_name, int amount ) {
int before;
get_data_file( name );
before = accounts[ bank_name ];
if ( amount < 0 ) {
accounts = m_delete( accounts, bank_name );
} else {
accounts[ bank_name ] = amount;
}
do_cheat_check(name, bank_name, amount, "to", before);
save_data_file( name );
return;
} /* set_account() */
/**
* Query the accounts a player has.
*
* @param player the name of the player
*/
string *query_accounts(string player) {
get_data_file(player);
if(!accounts)
return ({ });
return keys(accounts);
}
/**
* THis method creates a new bank.
* @param name the name of the bank
* @param master the location of the master bank
*/
void create_new_bank(string name, string master) {
class bank_data data;
if (_banks[name]) {
return ;
}
data = new(class bank_data);
data->master_office = master;
data->franchises = ({ });
data->cost_to_start = 2600000;
data->default_cost_per_month = 360000;
data->default_cost_per_new_account = 400;
_banks[name] = data;
save_banks();
} /* create_new_banks() */
/**
* This method removes a bank from the current list ofbanks.
* @param name the name of the bank to remove
*/
void remove_bank(string name) {
map_delete(_banks, name);
save_banks();
} /* remove_bank() */
/**
* This method is to be used for testing.
*/
class bank_data query_bank_data(string name) {
return copy(_banks[name]);
} /* query_bank_data() */
/**
* This method adds a new franchise to the operation.
* @param name the name of the bank set
* @param franchise_office the new franchise to add
*/
void add_new_franchise(string name, string franchise_office) {
class franchise franchise;
if (!_banks[name]) {
return ;
}
foreach (franchise in _banks[name]->franchises) {
if (franchise->office == franchise_office) {
return ;
}
}
franchise = new(class franchise);
franchise->office = franchise_office;
franchise->cost_per_month = _banks[name]->default_cost_per_month;
franchise->cost_per_new_account = _banks[name]->default_cost_per_new_account;
_banks[name]->franchises += ({ franchise });
save_banks();
return ;
} /* add_new_franchies() */
/**
* This method sets the new cost for opening a franchise for the bank.
* @param bank the bank to change the cost for
* @param amount the new amount to charge to open
*/
void set_bank_default_cost_to_open(string name, int amount) {
if (!_banks[name]) {
return ;
}
_banks[name]->cost_to_start = amount;
save_banks();
return ;
} /* set_bank_default_cost_to_open() */
/**
* This method sets the new cost for opening a franchise for the bank.
* @param bank the bank to change the cost for
* @param amount the new amount to charge to open
*/
void set_bank_default_cost_per_new_account(string name, int amount) {
if (!_banks[name]) {
return ;
}
_banks[name]->default_cost_per_new_account = amount;
save_banks();
return ;
} /* set_bank_cost_per_new_account() */
/**
* This method sets the new cost for opening a franchise for the bank.
* @param bank the bank to change the cost for
* @param franchise the franchise to change the amounts for
* @param amount the new amount to charge to open
*/
void set_bank_franchise_cost_per_month(string name, string franchise_office,
int amount) {
class franchise franchise;
if (!_banks[name]) {
return ;
}
foreach (franchise in _banks[name]->franchises) {
if (franchise->office == franchise_office) {
franchise->cost_per_month = amount;
save_banks();
return ;
}
}
return ;
} /* set_bank_franchise_cost_per_month() */
/**
* This method sets the new cost for opening a franchise for the bank.
* @param bank the bank to change the cost for
* @param amount the new amount to charge to open
*/
void set_bank_franchise_cost_per_new_account(string name, int amount) {
if (!_banks[name]) {
return ;
}
_banks[name]->cost_per_new_account = amount;
save_banks();
return ;
} /* set_bank_franchise_cost_per_new_account() */
/**
* This method sets the new cost for opening a franchise for the bank.
* @param bank the bank to change the cost for
* @param amount the new amount to charge to open
*/
void set_bank_default_cost_per_month(string name, int amount) {
if (!_banks[name]) {
return ;
}
_banks[name]->default_cost_per_month = amount;
save_banks();
return ;
} /* set_bank_default_cost_per_month() */
/**
* This method returns the new cost for opening a franchise for the bank.
* @param bank the bank to change the cost for
* @param amount the new amount to charge to open
*/
int query_bank_default_cost_to_open(string name) {
if (!_banks[name]) {
return -1;
}
return _banks[name]->cost_to_start;
} /* query_bank_default_cost_to_open() */
/**
* This method returns the new cost for opening a franchise for the bank.
* @param bank the bank to change the cost for
* @param amount the new amount to charge to open
*/
int query_bank_default_cost_per_new_account(string name) {
if (!_banks[name]) {
return -1;
}
return _banks[name]->default_cost_per_new_account;
} /* query_bank_cost_per_new_account() */
/**
* This method returns the new cost for opening a franchise for the bank.
* @param bank the bank to change the cost for
* @param franchise the franchise to change the amounts for
* @param amount the new amount to charge to open
*/
int query_bank_franchise_cost_per_month(string name, string franchise_office) {
class franchise franchise;
if (!_banks[name]) {
return -1;
}
foreach (franchise in _banks[name]->franchises) {
if (franchise->office == franchise_office) {
return franchise->cost_per_month;
}
}
return -1;
} /* query_bank_franchise_cost_per_month() */
/**
* This method returns the new cost for opening a franchise for the bank.
* @param bank the bank to change the cost for
* @param amount the new amount to charge to open
*/
int query_bank_franchise_cost_per_new_account(string name,
string franchise_office) {
class franchise franchise;
if (!_banks[name]) {
return -1;
}
foreach (franchise in _banks[name]->franchises) {
if (franchise->office == franchise_office) {
return franchise->cost_per_new_account;
}
}
return -1;
} /* query_bank_franchise_cost_per_new_account() */
/**
* This method returns the new cost for opening a franchise for the bank.
* @param bank the bank to change the cost for
* @param amount the new amount to charge to open
*/
int query_bank_default_cost_per_month(string name) {
if (!_banks[name]) {
return -1;
}
return _banks[name]->default_cost_per_month;
} /* query_bank_default_cost_per_month() */
/**
* This method returns the master office of the bank.
* @param name the bank name to check in
* @return the master office of the bank
*/
string query_bank_master_office(string name) {
if (!_banks[name]) {
return 0;
}
return _banks[name]->master_office;
} /* query_bank_master_officer() */
/**
* This method set the master office of the bank.
* @param name the bank name to check in
* @param master the master office of the bank
*/
void set_bank_master_office(string name, string master) {
if (!_banks[name]) {
return 0;
}
_banks[name]->master_office = master;
save_banks();
} /* set_bank_master_officer() */
/**
* This method returns the current list of banks.
* @return the current list of banks
*/
string* query_banks() {
return keys(_banks);
} /* query_banks() */
/**
* This method returns the franchises for the specified bank.
* @param bank the bank to get the franchises of
* @return the list of franchises
*/
string* query_franchises(string bank) {
if (!_banks[bank]) {
return ({ });
}
return map(_banks[bank]->franchises, (: $1->office :) );
} /* query_franchises() */
void do_cheat_check(string name, string bank_name, int amount,
string str, int after) {
#ifdef LOGGING
if((amount - after) > CHEAT_THRESHOLD) {
log_file ("BANK_CHEAT", sprintf ("%s: %s deposited %d into %s.\n",
ctime(time()), name, (amount-after),
bank_name));
}
#endif
}