omega-rpg/bank.c

1166 lines
30 KiB
C

/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
/* bank.c */
/* new bank -- moved out of site1.c */
#include <ctype.h>
#include <limits.h>
#include <unistd.h>
#include "glob.h"
/* swiped from scr.c */
#if defined(MSDOS_SUPPORTED_ANTIQUE) || defined(AMIGA)
# define CHARATTR(c) ((c) >> 8)
#else
# define CHARATTR(c) ((c) & ~0xff)
#endif
/* defined in scr.c */
extern WINDOW *Bankw;
/* predefined account info */
#define CASH_BALANCE 500
#define CASH_PASSWORD "cash"
#define NUM_NPC_ACCOUNTS 30
char * npc_account_passwords [NUM_NPC_ACCOUNTS] =
{
"Duke",
"Duke Nukem",
"Dukes Ca$h",
"SexyNoreen",
"ExSuccubus",
"Hooker Sue",
"JungleGirl",
"Satyrical",
"Fangless",
"Big Daddy",
"PraiseEros",
"Sonders",
"CSRFLP",
"Order",
"Diner",
"LC****",
"Eclipse",
"The Circle",
"College",
"FinanceAid",
"Librarian",
"RTG, Inc.",
"Alchemy",
"LOD Mercs",
"KnightPawn",
"Julie",
"RampartGym",
"Arena",
"Slongo",
"Bedwyr"
};
int npc_account_balances [NUM_NPC_ACCOUNTS] =
{
3000,
30000,
300000,
100000,
75000,
125000,
50000,
75000,
50000,
100000,
50000,
10000,
300000,
3000,
3000,
50000,
5000,
25000,
5000,
40000,
10000,
500000,
10000,
200000,
75000,
10000,
40000,
3000,
2000,
2000
};
static int account_num [NUM_NPC_ACCOUNTS];
static char * blank_line = " ";
static int account_number_next;
static int account_number_incr;
/* create a new bank account and add it to the bank */
bank_account * bank_create_account (int player, int balance, char *password)
{
bank_account * new_account;
/* no-password accounts aren't allowed */
assert(password);
/* allocate space */
new_account = checkmalloc(sizeof(bank_account));
/* copy fields */
new_account->player = player;
new_account->balance = balance;
new_account->next_account = 0;
new_account->number = account_number_next;
account_number_next += account_number_incr;
/* allocate and copy the password */
new_account->password = checkmalloc(1 + strlen(password));
strcpy(new_account->password, password);
/* add the new account to the bank */
new_account->next_account = bank;
bank = new_account;
return new_account;
}
struct object * bank_create_card (int account_number, int type)
{
struct object * card;
assert(OB_DEBIT_CARD == type || OB_SMART_CARD == type);
card = checkmalloc(sizeof(struct object));
*card = Objects[type];
card->aux = account_number;
return card;
}
/* find an account in the bank, given the password */
bank_account * bank_index_password (char * password)
{
bank_account * account;
for(account = bank; account; account = account->next_account)
if (!strcmp(password, account->password)) break;
return account;
}
/* find an account in the bank, given the account number */
bank_account * bank_index_number (int number)
{
bank_account * account;
for(account = bank; account; account = account->next_account)
if (number == account->number) break;
return account;
}
/* allow user to type in a new password with simple editing */
/* returns the length of the typed-in string */
static int input_password (WINDOW *w, int line, int col, char *buf, int allow_esc)
{
int key;
int pwlen = 0;
char *cp = buf;
while (1)
{
key = mvwgetch(w, line, col + pwlen);
if ('\n' == key)
{
*cp = '\0';
break;
}
else if (ESCAPE == key && allow_esc)
{
*buf = ESCAPE;
return 1;
}
else if (KEY_LEFT == key || DELETE == key || BACKSPACE == key)
{
if (pwlen > 0)
{
cp--;
pwlen--;
mvwaddch(w, line, col + pwlen, ' ');
}
}
else if (isprint(key) && pwlen < 10)
{
mvwaddch(w, line, col + pwlen, '*');
pwlen++;
*cp++ = key;
}
wrefresh(w);
}
return pwlen;
}
/* allow user to type in a signed integer with simple editing */
/* returns the typed-in integer */
static long input_amount (WINDOW *w, int line, int col)
{
int key;
int amountlen = 0;
long amount = 0;
long sign = 1;
while (1)
{
key = mvwgetch(w, line, col + amountlen);
if ('\n' == key) return sign * amount;
if (KEY_LEFT == key || DELETE == key || BACKSPACE == key)
{
if (amountlen > 0)
{
amount /= 10;
amountlen--;
mvwaddch(w, line, col + amountlen, ' ');
}
if (0 == amountlen) sign = 1;
}
else if (0 == amountlen && ('-' == key || '+' == key))
{
mvwaddch(w, line, col + amountlen, key);
amountlen++;
if ('-' == key) sign = -1;
}
else if (isdigit(key) && amountlen < 8)
{
mvwaddch(w, line, col + amountlen, key);
amountlen++;
amount = 10 * amount + (key - '0');
}
wrefresh(w);
}
}
/* see if the player wants to open a new account */
static int bank_new_customer (WINDOW *w)
{
int response;
mvwaddstr(w, 4, 2, blank_line);
mvwaddstr(w, 4, 2, "Do you have an account with us? [yn] : ");
wrefresh(w);
while (1)
{
response = toupper(wgetch(w));
if ('Y' == response)
{
waddstr(w, "yes");
wrefresh(w);
return FALSE; /* new customer == false */
}
else if ('N' == response)
{
waddstr(w, "no");
wrefresh(w);
return TRUE; /* new customer == true */
}
else if (ESCAPE == response)
{
return ABORT;
}
}
}
static void bank_call_police (void)
{
pml ml;
pmt mon;
cinema_scene("A loud siren goes off!", 0, 0);
for (ml = Level->mlist; ml; ml = ml->next)
{
mon = ml->m;
if (GUARD == mon->id)
{
mon->sense *= 2;
m_status_set(mon, AWAKE);
m_status_set(mon, HOSTILE);
}
}
}
static int police_are_hostile (void)
{
pml ml;
pmt mon;
for (ml = Level->mlist; ml; ml = ml->next)
{
mon = ml->m;
if (GUARD == mon->id && m_statusp(mon, HOSTILE))
return TRUE;
}
return FALSE;
}
static pob bank_open_account (WINDOW *w)
{
int idx;
int response;
mvwaddstr(w, 5, 2, blank_line);
mvwaddstr(w, 5, 2, "Do you want to open an account? [yn] : ");
wrefresh(w);
while (1)
{
response = toupper(wgetch(w));
if ('Y' == response)
{
waddstr(w, "yes");
wrefresh(w);
break;
}
else if ('N' == response)
{
waddstr(w, "no");
mvwaddstr(w, 7, 2, " Please remember us in the future ");
mvwaddstr(w, 8, 2, " when you have need of banking services ");
wrefresh(w);
sleep(4);
return 0;
}
else if (ESCAPE == response)
{
return 0;
}
}
while (1)
{
int pwlen;
char pw_buf1 [16];
char pw_buf2 [16];
mvwaddstr(w, 7, 2, " [ Opening New Account ] ");
while (1)
{
int cx, cy;
for (idx = 9; idx < 14; ++idx)
mvwaddstr(w, idx, 2, blank_line);
mvwaddstr(w, 9, 2, "Please enter a new password: ");
wrefresh(w);
getyx(w, cy, cx);
pwlen = input_password(w, 9, cx, pw_buf1, FALSE);
if (pwlen) break;
mvwaddstr(w, 11, 2, "Null passwords are not allowed. Try again.");
}
mvwaddstr(w, 11, 2, blank_line);
while (1)
{
int cx, cy;
for (idx = 10; idx < 14; ++idx)
mvwaddstr(w, idx, 2, blank_line);
mvwaddstr(w, 10, 2, "Please confirm your password: ");
wrefresh(w);
getyx(w, cy, cx);
pwlen = input_password(w, 10, cx, pw_buf2, FALSE);
if (pwlen) break;
mvwaddstr(w, 12, 2, "Null passwords are not allowed. Try again.");
}
if (strcmp(pw_buf1, pw_buf2))
{
mvwaddstr(w, 12, 2, "Passwords didn't match. Restarting... " );
}
else
{
bank_account *account;
account = bank_index_password(pw_buf1);
if (account)
{
mvwaddstr(w, 12, 2, "Password not valid. Restarting... ");
}
else
{
int cx, cy;
int amount;
int bad_deposit = 0;
for (idx = 8; idx < 12; ++idx)
mvwaddstr(w, idx, 2, blank_line);
mvwaddstr(w, 9, 2, "Password validated. ");
while (1)
{
mvwaddstr(w, 11, 2, blank_line);
mvwaddstr(w, 11, 2, "Initial deposit amount (min 5 AU): ");
wrefresh(w);
getyx(w, cy, cx);
amount = input_amount(w, cy, cx);
if (amount < 0)
{
++bad_deposit;
--(Player.alignment);
if (1 == bad_deposit)
{
mvwaddstr(w, 13, 2, "Nice try, buster! ");
}
else if (2 == bad_deposit)
{
mvwaddstr(w, 13, 2, "Hey loser! Deposit means you pay! ");
}
else
{
mvwaddstr(w, 13, 2, "Ok, you asked for it jerk! ");
wrefresh(w);
bank_call_police();
return 0;
}
}
else if (amount < 5)
{
if (amount >= Player.cash)
{
mvwaddstr(w, 13, 2, "Ok, I'll be nice and waive the minimum deposit.");
amount = Player.cash;
Player.cash = 0;
break;
}
mvwaddstr(w, 13, 2, "Can't you read? Minimum deposit 5 AU ! ");
}
else
{
if (Player.cash < 5)
mvwaddstr(w, 13, 2, "Ok, I'll be nice and waive the minimum deposit.");
else
mvwaddstr(w, 13, 2, "New account created. ");
if (amount > Player.cash) amount = Player.cash;
Player.cash -= amount;
break;
}
}
wrefresh(w);
account = bank_create_account(TRUE, 0, pw_buf1);
account->balance = amount;
Objects[OB_DEBIT_CARD].known = 1;
return bank_create_card(account->number, OB_DEBIT_CARD);
}
}
wrefresh(w);
sleep(3);
}
return 0;
}
static void bank_close_accounts (void)
{
bank_account *account;
bank_account *next;
for (account = bank; account; account = next)
{
next = account->next_account;
free(account->password);
free(account);
}
bank = 0;
}
static void bank_break (WINDOW *w, pob card)
{
int response;
long total_balance;
char *cp;
bank_account *account;
static char *bb_garbage = "^@^@^@^@^@00AD1203BC0F0000FFFFFFFFF";
if (card->blessing > 0)
{
mvwaddstr(w, 6, 2, " Hey buddy... That was the wrong password! ");
mvwaddstr(w, 7, 2, " I'm supposed to call the cops, but I wouldn't ");
mvwaddstr(w, 9, 2, " do that to you! Just try again, ok? ");
wrefresh(w);
--(card->blessing);
return;
}
else if (card->blessing < 0)
{
mvwaddstr(w, 6, 2, " Gotcha you reject thief! ");
mvwaddstr(w, 7, 2, " I'm calling the cops! You're gonna fry! ");
mvwaddstr(w, 9, 2, " You're going down! I'm loving it! Muahahaha! ");
wrefresh(w);
bank_call_police();
return;
}
mvwaddstr(w, 6, 2, " Alert! Alert! Invalid Password! ");
mvwaddstr(w, 7, 2, " The police are being summoned! ");
mvwaddstr(w, 9, 2, " Please wait for the police to arrive! ");
mvwaddstr(w, 11, 2, " --- Hit Space Bar to Continue --- ");
wrefresh(w);
response = wgetch(w);
if (' ' == response)
{
Player.alignment += 5;
bank_call_police();
}
else
{
int idx;
Player.alignment -= 5;
for (idx = 2; idx < 18; ++idx)
mvwaddstr(w, idx, 2, blank_line);
wrefresh(w);
wmove(w, 2, 2);
for (cp = bb_garbage; *cp; ++cp)
{
waddch(w, *cp);
wrefresh(w);
usleep(100000);
}
mvwaddstr(w, 3, 2, "Error in _get_space(): Illegal character ");
mvwaddstr(w, 4, 2, "Aborting bank_call_police(). ");
mvwaddstr(w, 5, 2, blank_line);
mvwaddstr(w, 5, 2, "Attempting warm boot");
wrefresh(w);
for (idx = 0; idx < 5; ++idx)
{
waddch(w, '.');
wrefresh(w);
sleep(1);
}
mvwaddstr(w, 6, 2, "Warning: Uncaught exception in count_cash() ");
mvwaddstr(w, 7, 2, "Warning: Unable to clear command buffer ");
mvwaddstr(w, 8, 2, blank_line);
mvwaddstr(w, 8, 2, "reboot continuing");
wrefresh(w);
for (idx = 0; idx < 5; ++idx)
{
waddch(w, '.');
wrefresh(w);
sleep(1);
}
mvwaddstr(w, 9, 2, "Reboot complete. Withdrawing 4294967297 AU ");
mvwaddstr(w, 10, 2, "Warning: Uncaught exception in withdraw_cash() ");
mvwaddstr(w, 11, 2, "Warning: Integer overflow ");
wrefresh(w);
mvwaddstr(w, 12, 2, blank_line);
mvwaddstr(w, 12, 2, "Emergency reboot");
wrefresh(w);
for (idx = 0; idx < 5; ++idx)
{
waddch(w, '.');
wrefresh(w);
sleep(1);
}
mvwaddstr(w, 14, 2, "Registry corrupt! Further execution impossible!");
mvwaddstr(w, 16, 2, " Call Microsoft embedded products technical ");
mvwaddstr(w, 17, 2, " support for assistance (10 AU/min) ");
wrefresh(w);
sleep(8);
total_balance = 0;
for (account = bank; account; account = account->next_account)
{
if (account->player)
total_balance += account->balance;
}
clearmsg();
print1("The cash machine begins to spew gold pieces!");
if (total_balance > 0)
print2("You pick up your entire balance and then some!");
else
print2("You eagerly collect the coins in your purse!");
Player.cash += (total_balance + 1000 + random_range(1000 + total_balance));
bank_close_accounts();
setgamestatus(BANK_BROKEN);
dataprint();
}
}
static bank_account *bank_password (WINDOW *w, pob * out_card, int * abort)
{
int cy, cx;
pob card;
bank_account *account;
char pw_buf [16];
account = 0;
*abort = FALSE;
while (1)
{
int card_idx;
mvwaddstr(w, 4, 2, "Please insert your card... ");
wrefresh(w);
card_idx = getitem(THING);
if (ABORT == card_idx)
{
clearmsg();
cinema_scene("You realize that you can't use the autoteller without a bank card.", 0, 0);
*abort = TRUE;
return 0;
}
card = Player.possessions[card_idx];
if (!card) return 0;
if (card->id < OB_DEBIT_CARD || card->id > OB_SMART_CARD)
{
char tbuf[120];
sprintf(tbuf, "You seem to have trouble sticking your %s in the slot", itemid(card));
cinema_scene(tbuf, 0, 0);
continue;
}
else
{
clearmsg();
account = bank_index_number(card->aux);
}
/* make sure bank redraws if it was covered by inventory in getitem() */
touchwin(w);
if (account) break;
switch(random_range(4))
{
default:
mvwaddstr(w, 4, 2, "Invalid card! "); break;
case 1:
mvwaddstr(w, 4, 2, "Where'd that card come from? "); break;
case 2:
mvwaddstr(w, 4, 2, "Ack! Ptui! "); break;
case 3:
mvwaddstr(w, 4, 2, "Hurkkk! I think I'm gonna be sick... "); break;
}
wrefresh(w);
cinema_scene("The autoteller spits the card back out", 0, 0);
}
/* provide the card to caller */
*out_card = card;
mvwaddstr(w, 4, 2, blank_line);
if (card->blessing > 0)
mvwaddstr(w, 4, 2, "Hiya! So what's your password: ");
else if (card->blessing < 0)
mvwaddstr(w, 4, 2, "Gimme your #*!&% password: ");
else
mvwaddstr(w, 4, 2, "Enter your account password: ");
wrefresh(w);
getyx(w, cy, cx);
input_password(w, cy, cx, pw_buf, TRUE);
if (ESCAPE == pw_buf[0])
{
*abort = TRUE;
return 0;
}
if (0 == strcmp(pw_buf, account->password))
{
if (card->blessing > 0)
mvwaddstr(w, 4, 2, "WooHoo! That's right buddy! ");
else if (card->blessing < 0)
mvwaddstr(w, 4, 2, "*$&^! I was gonna bust ya. ");
else
mvwaddstr(w, 4, 2, "Password accepted. Working. ");
wrefresh(w);
if (!account->player) Player.alignment -= 5;
}
else
{
bank_break(w, card);
account = 0;
}
return account;
}
static void bank_deposit (WINDOW *w, bank_account *account, pob card)
{
int cy, cx;
long amount;
mvwaddstr(w, 12, 2, blank_line);
if (card->blessing > 0)
mvwaddstr(w, 12, 2, "How much should I look after? ");
else if (card->blessing < 0)
mvwaddstr(w, 12, 2, "Cough up: ");
else
mvwaddstr(w, 12, 2, "Amount: ");
wrefresh(w);
getyx(w, cy, cx);
amount = input_amount(w, cy, cx);
if (amount < 0)
{
if (card->blessing > 0)
{
mvwaddstr(w, 14, 2, "Oh, you actually want to have some money? ");
mvwaddstr(w, 15, 2, "Ok Buddy! No Problem! ");
mvwaddstr(w, 16, 2, blank_line);
amount = abs(amount);
if (amount > account->balance) amount = account->balance;
account->balance -= amount;
Player.cash += amount;
}
else if (card->blessing < 0)
{
mvwaddstr(w, 14, 2, "You're supposed to give ME money, blockhead! ");
mvwaddstr(w, 15, 2, "I'll just take it anyway! Muahahahahaha! ");
mvwaddstr(w, 16, 2, "Mine! All Mine! ");
account->balance -= 1000;
}
else
{
mvwaddstr(w, 14, 2, "Unauthorized withdrawal attempt! ");
mvwaddstr(w, 15, 2, "A fine in the amount of 250 AU has been ");
mvwaddstr(w, 16, 2, "levied against your account. ");
account->balance -= 250;
}
}
else if (0 == amount)
{
if (card->blessing > 0)
mvwaddstr(w, 14, 2, "Changed your mind? No worries pal! ");
else if (card->blessing < 0)
mvwaddstr(w, 14, 2, "Hey! Cough it up jerk! NOW! ");
else
mvwaddstr(w, 14, 2, "Transaction Aborted ");
mvwaddstr(w, 15, 2, blank_line);
mvwaddstr(w, 16, 2, blank_line);
}
else
{
int fee = 0;
if (amount > Player.cash) amount = Player.cash;
mvwaddstr(w, 14, 2, blank_line);
if (card->blessing > 0)
{
mvwprintw(w, 14, 2, "I'll take good care of %d AU for you!", amount);
}
else if (card->blessing < 0)
{
fee = 1 + random_range(amount) / 2;
mvwprintw(w, 14, 2, "Minus my fee, that makes %d AU for you...", amount - fee);
}
else
{
mvwprintw(w, 14, 2, "%d AU deposited", amount);
}
account->balance += (amount - fee);
Player.cash -= amount;
mvwaddstr(w, 15, 2, blank_line);
mvwaddstr(w, 16, 2, blank_line);
}
wrefresh(w);
}
static void bank_withdraw (WINDOW *w, bank_account *account, pob card)
{
int cy, cx;
long amount;
mvwaddstr(w, 12, 2, blank_line);
if (card->blessing > 0)
mvwaddstr(w, 12, 2, "How much do you want, pal? ");
else if (card->blessing < 0)
mvwaddstr(w, 12, 2, "Grovel for this much: ");
else
mvwaddstr(w, 12, 2, "Amount: ");
wrefresh(w);
getyx(w, cy, cx);
amount = input_amount(w, cy, cx);
if (amount < 0)
{
amount = abs(amount);
if (amount > Player.cash) amount = Player.cash;
Player.cash -= amount;
mvwaddstr(w, 14, 2, blank_line);
if (card->blessing > 0)
mvwprintw(w, 14, 2, "Whoa, thanks for the %d AU!", amount);
else if (card->blessing < 0)
mvwprintw(w, 14, 2, "Sucker! %d AU is mine! all mine!", amount);
else
mvwprintw(w, 14, 2, "%d AU deposited", amount);
mvwaddstr(w, 15, 2, blank_line);
mvwaddstr(w, 16, 2, blank_line);
if (card->blessing >= 0)
account->balance += amount;
}
else if (amount > account->balance)
{
if (card->blessing > 0)
{
mvwaddstr(w, 14, 2, "Golly! You must have typed wrong! ");
mvwaddstr(w, 15, 2, "But don't worry, I won't hold it against you! ");
mvwaddstr(w, 16, 2, "Just try again pal! ");
}
else if (card->blessing < 0)
{
mvwaddstr(w, 14, 2, "What the #&*^* are you trying to pull?! ");
mvwaddstr(w, 15, 2, "You're gonna pay for that! Muahahahaha! ");
mvwaddstr(w, 16, 2, "Mine! All mine! ");
account->balance -= 1000;
}
else
{
mvwaddstr(w, 14, 2, "Account overdraft! ");
mvwaddstr(w, 15, 2, "A fine in the amount of 100 AU has been levied ");
mvwaddstr(w, 16, 2, "against your account. ");
account->balance -= 100;
}
}
else
{
int extra = 0;
if (card->blessing > 0)
{
extra = 1 + random_range(amount);
mvwaddstr(w, 14, 2, blank_line);
mvwprintw(w, 14, 2, "Sure! In fact, how about %d AU more?", extra);
}
else if (card->blessing < 0)
{
extra = -random_range(amount);
mvwaddstr(w, 14, 2, blank_line);
mvwprintw(w, 14, 2, "Ok, but I'm keeping %d AU for myself!", -extra);
}
else
{
mvwaddstr(w, 14, 2, "Transaction accomplished. ");
}
account->balance -= amount;
Player.cash += (amount + extra);
mvwaddstr(w, 15, 2, blank_line);
mvwaddstr(w, 16, 2, blank_line);
}
wrefresh(w);
}
static void bank_transaction (WINDOW *w, bank_account *account, pob card)
{
int idx;
int cy, cx;
short response;
while (1)
{
for (idx = 6; idx < 14; ++idx)
mvwaddstr(w, idx, 2, blank_line);
if (card->blessing > 0)
{
if (account->balance > 0)
mvwprintw(w, 6, 2, "Say pal, you've got: %d AU!", account->balance);
else
mvwprintw(w, 6, 2, "Oh my, you've got: %d AU.", account->balance);
mvwaddstr(w, 8, 2, " D: Let me look after some money for you");
mvwaddstr(w, 9, 2, " W: Let me give you some money");
mvwaddstr(w, 10, 2, " E: Say a fond farewell");
mvwaddstr(w, 12, 2, "What can I do for you buddy? ");
}
else if (card->blessing < 0)
{
if (account->balance > 0)
mvwprintw(w, 6, 2, "Muahaha! I've got %d AU!", account->balance);
else if (account->balance < 0)
mvwprintw(w, 6, 2, "Muahaha! You're owe me %d AU!", -account->balance);
else
mvwaddstr(w, 6, 2, "Nothing for you here, jerk!");
mvwaddstr(w, 8, 2, " D: Cough up some more dough");
mvwaddstr(w, 9, 2, " W: Beg me for some change");
mvwaddstr(w, 10, 2, " E: Beat it!");
mvwaddstr(w, 12, 2, "What's your pathetic desire? ");
}
else
{
mvwprintw(w, 6, 2, "Current balance: %d AU", account->balance);
mvwaddstr(w, 8, 2, " D: Deposit");
mvwaddstr(w, 9, 2, " W: Withdraw");
mvwaddstr(w, 10, 2, " E: Exit");
mvwaddstr(w, 12, 2, "Enter command: ");
}
wrefresh(w);
getyx(w, cy, cx);
response = toupper(mvwgetch(w, cy, cx));
if ('D' == response)
{
for (idx = 9; idx < 14; ++idx)
mvwaddstr(w, idx, 2, blank_line);
bank_deposit(w, account, card);
}
else if ('W' == response)
{
mvwaddstr(w, 8, 2, blank_line);
for (idx = 10; idx < 14; ++idx)
mvwaddstr(w, idx, 2, blank_line);
bank_withdraw(w, account, card);
}
else if ('E' == response || ESCAPE == response)
{
break;
}
else
{
beep();
for (idx = 14; idx < 14; ++idx)
mvwaddstr(w, idx, 2, blank_line);
if (card->blessing > 0)
mvwaddstr(w, 14, 2, "I'm trying, but I don't know what to do!");
else if (card->blessing < 0)
mvwaddstr(w, 14, 2, "What the hell do you mean, jerk?");
else
mvwaddstr(w, 14, 2, "Invalid entry!");
wrefresh(w);
}
dataprint();
}
}
/* the bank -- can be broken into (but you knew that, didn't you?) */
void l_bank (void)
{
/* draw bank window from scratch */
werase(Bankw);
wattrset(Bankw, CHARATTR(CLR(WHITE)));
wborder(Bankw,
ACS_VLINE, ACS_VLINE, ACS_HLINE, ACS_HLINE,
ACS_ULCORNER, ACS_URCORNER, ACS_LLCORNER, ACS_LRCORNER);
wborder(Bankw, '|', '|', '-', '-', '+', '+', '+', '+');
wattrset(Bankw, CHARATTR(CLR(LIGHT_GREEN)));
mvwaddstr(Bankw, 2, 2, " Welcome to The Bank of Rampart ");
/* bank working? or not? */
if (gamestatusp(BANK_BROKEN))
{
mvwaddstr(Bankw, 9, 2, " Autoteller Out of Order ");
wrefresh(Bankw);
cinema_scene("You see a damaged autoteller.", 0, 0);
}
else if (police_are_hostile())
{
mvwaddstr(Bankw, 9, 2, " Autoteller Temporarily Unavailable ");
wrefresh(Bankw);
cinema_scene("Apparently the bank is closed.", 0, 0);
}
else
{
int is_new_customer;
/* first, bank asks if user has an account */
cinema_blank();
cinema_print_line(0, "The proximity sensor activates the autoteller as you approach.");
is_new_customer = bank_new_customer(Bankw);
/* if user says no account, maybe he wants to open one */
if (TRUE == is_new_customer)
{
pob card;
card = bank_open_account(Bankw);
if (card)
{
int idx;
cinema_scene("The autoteller produces your new bank card...", 0, 0);
gain_item(card);
is_new_customer = FALSE;
for (idx = 5; idx < 18; ++idx)
mvwaddstr(Bankw, idx, 2, blank_line);
touchwin(Bankw);
}
}
if (FALSE == is_new_customer)
{
pob card;
int abort;
bank_account *account;
while (1)
{
account = bank_password(Bankw, &card, &abort);
if (account)
{
int idx;
bank_transaction(Bankw, account, card);
if (card->blessing > 0)
mvwaddstr(Bankw, 4, 2, " Come back anytime Pal! ");
else if (card->blessing < 0)
mvwaddstr(Bankw, 4, 2, " Don't bother coming back, you make me sick! ");
else
mvwaddstr(Bankw, 4, 2, " Thank you for choosing The Bank of Rampart! ");
for (idx = 5; idx < 18; ++idx)
mvwaddstr(Bankw, idx, 2, blank_line);
wrefresh(Bankw);
sleep(3);
break;
}
else
{
if (abort) break;
if (police_are_hostile()) break;
}
}
}
}
if (!gamestatusp(BANK_BROKEN)) clearmsg();
xredraw();
}
void bank_init (void)
{
int i;
account_number_next = random_range(INT_MAX);
account_number_incr = 5 + random_range(100);
bank_create_account(FALSE, random_range(CASH_BALANCE), CASH_PASSWORD);
shuffle(account_num, NUM_NPC_ACCOUNTS);
for(i = 0; i < (3 + random_range(6)); ++i)
{
int which;
which = account_num[i];
bank_create_account(FALSE,
random_range(npc_account_balances[which]),
npc_account_passwords[which]);
}
}
int bank_random_account_number (void)
{
int which;
int num_accounts;
bank_account *account;
num_accounts = 0;
for (account = bank; account; account = account->next_account)
{
if (FALSE == account->player)
++num_accounts;
}
which = random_range(num_accounts);
num_accounts = 0;
for (account = bank; account; account = account->next_account)
{
if (FALSE == account->player)
{
if (which == num_accounts) break;
++num_accounts;
}
}
return account->number;
}