// ==> This file will deal with bankierence, and its awarding/subtracting...
#include "../mud.h"
#include "../character.h"
#include "../account.h"
#include "../storage.h"
#include "../auxiliary.h"
#include "../handler.h"
#include "../socket.h"
#include "../utils.h"
#include "../save.h"
#include "../set_val/set_val.h"
#include "../bitvector.h"
#include "../room.h"
#include "../money/money.h"
#include "../world.h"
#include "banks.h"
/************************************************************************
* auxiliary data for bank *
************************************************************************/
typedef struct bank_data {
int bank;
} BANK_DATA;
BANK_DATA *newBankData() {
BANK_DATA *data = malloc(sizeof(BANK_DATA));
data->bank = 0;
return data;
}
void deleteBankData(BANK_DATA *data) {
free(data);
}
void bankDataCopyTo(BANK_DATA *from, BANK_DATA *to) {
to->bank = from->bank;
}
BANK_DATA *bankDataCopy(BANK_DATA *data) {
BANK_DATA *new_data = newBankData();
bankDataCopyTo(data, new_data);
return new_data;
}
STORAGE_SET *bankDataStore(BANK_DATA *data) {
STORAGE_SET *set = new_storage_set();
store_int(set, "bank", data->bank);
return set;
}
BANK_DATA *bankDataRead(STORAGE_SET *set) {
BANK_DATA *data = newBankData();
data->bank = read_int(set, "bank");
return data;
}
int charGetBank(CHAR_DATA *ch)
{
BANK_DATA *data = charGetAuxiliaryData(ch, "bank_aux_data");
return data->bank;
}
void charSetBank(CHAR_DATA *ch, int new_bank)
{
BANK_DATA *bankdata = charGetAuxiliaryData(ch, "bank_aux_data");
bankdata->bank = new_bank;
return;
}
void getbalance(CHAR_DATA *ch, ROOM_DATA *room)
{
if(bitIsOneSet(roomGetBits(room), "bank"))
{
if(charGetBank == 0 || charGetBank == NULL){
send_to_char(ch, "{gA banker informs you that you do not currently have an account.\r\n");
}else{
send_to_char(ch, "{gA banker informs you of your balance:\r\n");
send_to_char(ch, "You have saved {c%d {ggold coin%s.\r\n", charGetBank(ch), (charGetBank(ch) == 1 ? "" : "s"));}
}else{
send_to_char(ch, "{gYou must stand within a bank to find out about your balance.\r\n");
}
}
COMMAND(cmd_balance)
{
getbalance(ch, charGetRoom(ch));
}
COMMAND(cmd_withdraw)
{
int bank_withdrawl;
int newbank;
int newmoney;
ROOM_DATA *room = charGetRoom(ch);
if(!parse_args(ch, TRUE, cmd, arg, "int", &bank_withdrawl))
return;
int bank_balance;
bank_balance = (charGetBank(ch));
int char_money;
char_money = (charGetMoney(ch));
if(!bitIsOneSet(roomGetBits(room), "bank"))
{
send_to_char(ch, "You must stand within a bank to make a withdrawl.");
return;
}
if(bank_balance == 0)
{
send_to_char(ch, "{gA banker informs you that you do not currently have an account.\r\n");
return;
}else{
if(bank_balance < bank_withdrawl)
{
send_to_char(ch, "{gA banker states that you do not have that much in your account.\r\n");
}else{
if(bank_balance == bank_withdrawl || bank_balance > bank_withdrawl)
{
newbank = (bank_balance - bank_withdrawl);
charSetBank(ch, newbank);
newmoney = (char_money + bank_withdrawl);
charSetMoney(ch, newmoney);
send_to_char(ch, "{gA banker hands you %d gold coin%s.\r\n", bank_withdrawl, (bank_withdrawl == 1 ? "" : "s"));
}
}
}
}
COMMAND(cmd_deposit)
{
int bank_deposits;
int newbalance;
int newcash;
ROOM_DATA *room = charGetRoom(ch);
if(!parse_args(ch, TRUE, cmd, arg, "int", &bank_deposits))
return;
int bank_balances;
bank_balances = (charGetBank(ch));
int char_cash;
if(!bitIsOneSet(roomGetBits(room), "bank"))
{
send_to_char(ch, "You must stand within a bank to make a deposit.");
return;
}
char_cash = (charGetMoney(ch));
if(char_cash == 0)
{
send_to_char(ch, "{gYou must have cash to make a deposit.\r\n");
}else{
if(char_cash < bank_deposits)
{
send_to_char(ch, "{gYou don't have enough cash on hand to make that deposit.\r\n");
return;
}else{
if(char_cash == bank_deposits || char_cash > bank_deposits)
{
newbalance = (bank_balances + bank_deposits);
charSetBank(ch, newbalance);
newcash = (char_cash - bank_deposits);
charSetMoney(ch, newcash);
send_to_char(ch, "{gYou hand %d gold coin%s to a banker for safe keeping.\r\n", bank_deposits, (bank_deposits == 1 ? "" : "s"));
}
}
}
}
/************************************************************************
Below here are all of the init_ functions for this file.
*************************************************************************/
void init_bank(void)
{
add_set("bank", SET_CHAR, SET_TYPE_INT, charSetBank, NULL);
auxiliariesInstall("bank_aux_data", newAuxiliaryFuncs(AUXILIARY_TYPE_CHAR, newBankData,
deleteBankData, bankDataCopyTo, bankDataCopy, bankDataStore, bankDataRead));
add_cmd("balance", "bal", cmd_balance, POS_UNCONCIOUS, POS_FLYING, "player", TRUE, FALSE);
bitvectorAddBit("room_bits", "bank");
add_cmd("withdraw", "with", cmd_withdraw, POS_UNCONCIOUS, POS_FLYING, "player", TRUE, FALSE);
add_cmd("deposit", "depo", cmd_deposit, POS_UNCONCIOUS, POS_FLYING, "player", TRUE, FALSE);
}