/*
* WDL - stupid bank code, May, 1999.
* this uses come code recycled from, prolly, diku.
* all relevant and verbose licenses apply
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "merc.h"
#include "utils.h"
#include "tables.h"
#include "lookup.h"
/* command procedures needed */
DECLARE_DO_FUN(do_say);
CHAR_DATA *find_banker(CHAR_DATA * ch)
{
CHAR_DATA *banker;
if (IS_NPC(ch))
return NULL;
for (banker = ch->in_room->people; banker;
banker = banker->next_in_room) {
if (IS_NPC(banker) && IS_SET(banker->act, ACT_BANKER))
break;
}
if (banker && !can_see(banker, ch)) {
do_say(banker, "I'm not taking money from someone I can't see!");
return NULL;
}
return banker;
}
void do_balance(CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *banker;
if (IS_NPC(ch))
return;
if ((banker = find_banker(ch)) == NULL) {
send_to_char("You need to go find a bank, first.\r\n", ch);
return;
}
sprintf(buf, "You currently have %ld gold in the bank, %s.\r\n",
ch->pcdata->balance, ch->name);
do_say(banker, buf);
return;
}
void do_withdraw(CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *banker;
long amount;
if (IS_NPC(ch))
return;
amount = atoi(argument);
if ((banker = find_banker(ch)) == NULL) {
send_to_char("You need to go find a bank, first.\r\n", ch);
return;
}
if (amount < 1) {
send_to_char("Try a real amount of money, please.\r\n", ch);
return;
}
if (amount > ch->pcdata->balance) {
sprintf(buf,
"You can't withdraw %ld gold when you have a balance of %ld gold, %s.\r\n",
amount, ch->pcdata->balance, ch->name);
do_say(banker, buf);
return;
}
ch->gold += amount;
ch->pcdata->balance -= amount;
do_balance(ch, "");
return;
}
void do_deposit(CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *banker;
long amount;
if (IS_NPC(ch))
return;
amount = atoi(argument);
if ((banker = find_banker(ch)) == NULL) {
send_to_char("You need to go find a bank, first.\r\n", ch);
return;
}
if (amount < 1) {
send_to_char("Try a real amount of money, please.\r\n", ch);
return;
}
if (amount > ch->gold) {
sprintf(buf,
"You can't deposit %ld gold when you're only carrying %ld gold, %s.\r\n",
amount, ch->gold, ch->name);
do_say(banker, buf);
return;
}
ch->gold -= amount;
ch->pcdata->balance += amount;
do_balance(ch, "");
return;
}
void do_ping(CHAR_DATA * ch, char *argument)
{
send_to_char( "pong.\r\n", ch );
return;
}
void do_cbalance(CHAR_DATA * ch, char *argument) {
int i;
CHAR_DATA *banker;
char buf[MSL];
if (IS_NPC(ch))
return;
if (IS_IMMORTAL(ch)) {
for ( i = 1; i < MAX_CLAN; i++ ) {
sprintf(buf, "Clan: %-10s Balance: %ld\r\n",
clan_table[i].name,
clan_table[i].balance);
send_to_char(buf, ch);
}
return;
}
if (!ch->clan) {
send_to_char( "You're not in a clan, silly.\r\n", ch );
return;
}
if ((banker = find_banker(ch)) == NULL) {
send_to_char("You need to go find a bank, first.\r\n", ch);
return;
}
sprintf(buf, "Clan: %-10s Balance: %ld",
clan_table[ch->clan].name,
clan_table[ch->clan].balance);
do_say(banker, buf);
return;
}
void do_cdeposit(CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *banker;
long amount;
if (IS_NPC(ch) || (!ch->clan)) {
send_to_char( "You're not in a clan, silly.\r\n", ch );
return;
}
amount = atoi(argument);
if ((banker = find_banker(ch)) == NULL) {
send_to_char("You need to go find a bank, first.\r\n", ch);
return;
}
if (amount < 1) {
send_to_char("Try a real amount of money, please.\r\n", ch);
return;
}
if (amount > ch->gold) {
sprintf(buf,
"You can't deposit %ld gold when you're only carrying %ld gold, %s.\r\n",
amount, ch->gold, ch->name);
do_say(banker, buf);
return;
}
ch->gold -= amount;
clan_table[ch->clan].balance += amount;
do_cbalance(ch, "");
return;
}
void do_cwithdraw(CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *banker;
long amount;
if (IS_NPC(ch) || (!ch->clan)) {
send_to_char( "You're not in a clan, silly.\r\n", ch );
return;
}
amount = atoi(argument);
if ((banker = find_banker(ch)) == NULL) {
send_to_char("You need to go find a bank, first.\r\n", ch);
return;
}
if (amount < 1) {
send_to_char("Try a real amount of money, please.\r\n", ch);
return;
}
if (amount > clan_table[ch->clan].balance) {
sprintf(buf,
"You can't withdraw %ld gold when your clan has a balance of %ld gold, %s.\r\n",
amount, clan_table[ch->clan].balance, ch->name);
do_say(banker, buf);
return;
}
ch->gold += amount;
clan_table[ch->clan].balance -= amount;
do_cbalance(ch, "");
return;
}
void cbank_save() {
int i;
FILE *fp;
fclose(fpReserve);
if ((fp = fopen("cbank.dat", "w")) == NULL) {
bug("cbank_save: cbank.dat: fopen", 0);
fpReserve = fopen(NULL_FILE, "r");
return;
}
for ( i = 1; i < MAX_CLAN; i++ ) {
fprintf(fp, "%s %ld\n",
clan_table[i].name,
clan_table[i].balance);
}
fclose(fp);
fpReserve = fopen(NULL_FILE, "r");
return;
}
void cbank_load() {
FILE *fp;
int clan;
fclose(fpReserve);
if ((fp = fopen("cbank.dat", "r")) == NULL) {
bug("cbank_load: cbank.dat: fopen", 0);
fpReserve = fopen(NULL_FILE, "r");
return;
}
for (;;) {
if (feof(fp))
break;
clan = clan_lookup(fread_word(fp));
clan_table[clan].balance = fread_number(fp);
fread_to_eol(fp);
}
fclose(fp);
fpReserve = fopen(NULL_FILE, "r");
return;
}