// ==> 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); }