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