/***************************************************************************
* Port of ROM 2.4b6 to Windows by TAKA *
* *
* I call this "NEW ROM" Ghost since it has changed extensively. *
* This version runs as a native console application *
* windows NT 4 service patch 3, Windows 95 software version release 2 *
* and windows 98. *
* *
* Ghost to my knowledge is the first ROM port to windows to be 100% *
* stable. *
* *
* I compiled it using MS Vissual C++ 5.0 *
* THE FOLLOWING MODULES WERE MODIFIED TO ALLOW STABLE WINDOWS OPERATION *
* - merc.h *
* - comm.c *
* - db.c *
* BE SURE TO INCLUDE IN THE LINK LIST *
* - wsock32.lib *
* *
* Other source files are straight from the ROM24b6 distribution. *
* *
* ALL I ASK FOR MY WORK: *
* 1) Is that you do not remove or modify this comment block. *
* 2) You must state on the entry screen that this is GHOST a ROM code *
* base designed and ported to windows by TAKA . *
* 3) The latest version number from you source listing must be must be *
* in the help file as well as my name TAKA *
* and my email a_ghost_dancer@excite.com *
* < < Simplist way is to leave my help entry supplied > > *
* 4) You must abid by all other ROM and MERC licences *
* 5) Finally any improvements or snippets you make please forward them *
* to me so we can imcorperate them into the latest version. I will *
* post all snippets with the authors named and credited. *
* *
* Last thank you to all the ROM amd MERC folks for this wounderful code *
* base know as ROM. *
* *
* TAKA *
* a_ghost_dancer@excite.com *
* *
***************************************************************************
*
* TAKA banking/investment system.
* modled in part after maniacs code.
*
*/
#if defined(macintosh)
#include <types.h>
#include <time.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "merc.h"
DECLARE_DO_FUN(do_say );
DECLARE_DO_FUN(do_save );
void do_bank( CHAR_DATA *ch, char *argument )
{
/*
* based on:
* Simple banking system. by -- Stephen --
*
*/
CHAR_DATA *mob;
char buf[MAX_STRING_LENGTH];
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
if ( IS_NPC( ch ) )
{
send_to_char( "{RBanking Services are only available to players!{x\n\r", ch );
return;
}
/* Check for mob with act->banker */
for ( mob = ch->in_room->people; mob; mob = mob->next_in_room )
{
if (( IS_NPC(mob) && IS_SET(mob->act, ACT_BANKER ) )
|| ( IS_NPC(mob) && IS_SET(mob->act, ACT_ATM )))
break;
}
if ( mob == NULL )
{
send_to_char( "{RYou can't do that here.{x\n\r", ch );
return;
}
if ((!IS_SET(mob->act, ACT_ATM)) || (BANK_ALLOW_ATM != 1))
{
if ((time_info.hour < 9) || (time_info.hour > 17))
{
send_to_char( "{RThe bank is closed, it is open from {W9am {Rto {W5pm{R.{x\n\r", ch);
return;
}
}
if ( argument[0] == '\0' )
{
send_to_char( "{GBanking system by {WTAKA {Goptions:{x\n\r\n\r", ch );
send_to_char( "{GBank balance {M: {WDisplays your balance.{x\n\r", ch );
send_to_char( "{GBank deposit {M: {WDeposit gold into your account.{x\n\r", ch );
send_to_char( "{GBank withdraw {M: {WWithdraw gold from your account.{x\n\r", ch );
if (BANK_DEPOSIT_SILVER == 1)
{
send_to_char("{GBank swithdraw {M: {WWithdraw silver from your account.{x\n\r", ch );
send_to_char("{GBank sdeposit {M: {WDeposit silver into your account.{x\n\r", ch );
}
if (BANK_CONVERT_SILVER == 1)
send_to_char( "{GBank convert {M: {WConverts {D100 silver {Wto {y1 gold{W.{x\n\r", ch );
#if defined BANK_TRANSFER
if (IS_SET(mob->act, ACT_BANKER))
{
send_to_char( "{GBank transfer : {M: {WTransfer gold to account.{x\n\r", ch);
send_to_char( "{GBank buy1 # {M: {WBuy # shares in type I stocks.{x\n\r", ch);
send_to_char( "{GBank buy2 # {M: {WBuy # shares in type II stocks.{x\n\r", ch);
send_to_char( "{GBank buy3 # {M: {WBuy # shares in type III stocks.{x\n\r", ch);
send_to_char( "{GBank buy4 # {M: {WBuy # shares in type IV stocks.{x\n\r", ch);
send_to_char( "{GBank sell1 # {M: {WSell # shares of type I stocks.{x\n\r", ch);
send_to_char( "{GBank sell2 # {M: {WSell # shares of type II stocks.{x\n\r", ch);
send_to_char( "{GBank sell3 # {M: {WSell # shares of type III stocks.{x\n\r", ch);
send_to_char( "{GBank sell4 # {M: {WSell # shares of type IV stocks.{x\n\r", ch);
send_to_char( "{GBank check {M: {WCheck the current rates of the shares.{x \n\r", ch);
}
#endif
return;
}
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
/* Now work out what to do... */
if ( !str_prefix( arg1, "balance" ) )
{
if (BANK_DEPOSIT_SILVER != 1)
sprintf(buf,"{GYour current balance is: {y%ld GP{G.{x\n\r",ch->pcdata->balance );
else
sprintf(buf,"{GYour current balance is: {y%ld GP {Gand {D%ld SP{G.{x\n\r",
ch->pcdata->balance, ch->pcdata->sbalance );
do_say(mob, buf);
return;
}
if ( !str_prefix( arg1, "deposit" ) )
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if (amount > ch->gold )
{
sprintf( buf, "{RHow can you deposit {y%d GP {Rwhen you only have {y%ld{R?{x\n\r", amount, ch->gold );
do_say(mob, buf );
return;
}
if (amount < 0 )
{
do_say (mob, "{ROnly positive amounts allowed...{x");
return;
}
ch->gold -= amount;
ch->pcdata->balance += amount;
sprintf ( buf, "{GYou deposit {y%d GP{G. Your new balance is {y%ld GP{G.{x\n\r",
amount, ch->pcdata->balance );
send_to_char( buf, ch );
do_save( ch, "" );
return;
}
}
if (( !str_prefix( arg1, "sdeposit" ) ) && (BANK_DEPOSIT_SILVER == 1))
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if (amount > ch->silver )
{
sprintf( buf, "{RHow can you deposit {D%d SP {Rwhen you only have {D%ld{R?{x\n\r", amount, ch->silver );
do_say(mob, buf );
return;
}
if (amount < 0 )
{
do_say (mob, "{ROnly positive amounts allowed...{x");
return;
}
ch->silver -= amount;
ch->pcdata->sbalance += amount;
sprintf ( buf, "{GYou deposit {D%d SP{G. Your new balance is {D%ld SP{G.{x\n\r",
amount, ch->pcdata->sbalance );
send_to_char( buf, ch );
do_save( ch, "" );
return;
}
}
/* We only allow transfers if this is true... so define it... */
#if defined BANK_TRANSFER
if ( !str_prefix( arg1, "transfer" ) )
{
int amount;
CHAR_DATA *victim;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( amount > ch->pcdata->balance )
{
sprintf( buf, "{RHow can you transfer {y%d GP {Gwhen your balance is {y%ld{R?{x\n\r",
amount, ch->pcdata->balance );
do_say( mob, buf);
return;
}
if (amount < 0 )
{
do_say (mob, "{ROnly positive amounts allowed...{x");
return;
}
if ( !( victim = get_char_world( ch, argument ) ) )
{
sprintf (buf, "{W%s {Rdoesn't have a bank account.{x\n\r", argument );
do_say( mob, buf );
return;
}
if (IS_NPC(victim))
{
do_say( mob, "{RYou can only transfer money to players.{x");
return;
}
ch->pcdata->balance -= amount;
victim->pcdata->balance += amount;
sprintf( buf, "{GYou transfer {y%d GP{G. Your new balance is {y%ld GP{G.{x\n\r",
amount, ch->pcdata->balance );
send_to_char( buf, ch );
sprintf (buf, "{C[{WBANK{C] {W%s {Ghas transferred {y%d gold pieces {Gto your account.{x\n\r",
ch->name, amount);
send_to_char( buf, victim );
do_save( ch, "" );
do_save( victim, "");
return;
}
}
#endif
if ( !str_prefix( arg1, "withdraw" ) )
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( amount > ch->pcdata->balance )
{
sprintf( buf, "{RHow can you withdraw {y%d GP {Rwhen your balance is {y%ld{R?{x\n\r",
amount, ch->pcdata->balance );
do_say (mob, buf );
return;
}
if (amount < 0 )
{
do_say( mob, "{ROnly positive amounts allowed...{x");
return;
}
if (IS_SET(mob->act, ACT_ATM))
{
if ((amount >= (BANK_ALLOW_ATM_MAX + 1))
|| ((ch->pcdata->dailylimit + amount) >= (BANK_ALLOW_ATM_MAX + 1)))
{
sprintf( buf, "{RYou can only withdraw {y%d GP {Rfrom an ATM daily.{x\n\r",
BANK_ALLOW_ATM_MAX );
do_say(mob, buf);
return;
}
else
ch->pcdata->dailylimit += amount;
}
ch->pcdata->balance -= amount;
ch->gold += amount;
sprintf( buf, "{GYou withdraw {y%d GP{G. Your new balance is {y%ld GP{G.{x\n\r",
amount, ch->pcdata->balance );
send_to_char( buf, ch );
do_save( ch, "" );
return;
}
}
if (( !str_prefix( arg1, "swithdraw" ) ) && (BANK_DEPOSIT_SILVER == 1))
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( amount > ch->pcdata->sbalance )
{
sprintf( buf, "{RHow can you withdraw {D%d SP {Rwhen your balance is {D%ld{R?{x\n\r",
amount, ch->pcdata->sbalance );
do_say (mob, buf );
return;
}
if (amount < 0 )
{
do_say( mob, "{ROnly positive amounts allowed...{x");
return;
}
if (IS_SET(mob->act, ACT_ATM))
{
if ((amount >= ((BANK_ALLOW_ATM_MAX * 100) + 1))
|| (((ch->pcdata->dailylimit * 100) + amount) >= ((BANK_ALLOW_ATM_MAX * 100) + 1)))
{
sprintf( buf, "{RYou can only withdraw {D%d SP{R from an ATM daily.{x\n\r",
(BANK_ALLOW_ATM_MAX * 100) );
do_say(mob, buf);
return;
}
else
ch->pcdata->dailylimit += (amount / 100);
}
ch->pcdata->sbalance -= amount;
ch->silver += amount;
sprintf( buf, "{GYou withdraw {D%d SP{G. Your new balance is {D%ld SP{G.{x\n\r",
amount, ch->pcdata->sbalance );
send_to_char( buf, ch );
do_save( ch, "" );
return;
}
}
if (( !str_prefix( arg1, "convert" ) ) && (BANK_CONVERT_SILVER == 1 ))
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( amount > ch->pcdata->sbalance )
{
sprintf( buf, "{RHow can you convert {D%d SP {Rwhen your balance is {D%ld{R?{x\n\r",
amount, ch->pcdata->sbalance );
do_say (mob, buf );
return;
}
if (amount < 0 )
{
do_say( mob, "{ROnly positive amounts allowed...{x");
return;
}
if ((amount % 100) != 0)
{
do_say( mob, "{RYou can only convert silver in increaments of {D100{R....{x");
return;
}
ch->pcdata->sbalance -= amount;
ch->pcdata->balance += (amount / 100);
sprintf( buf, "{GYou convert {D%d SP {Gto {y%d GP{G. Your new balance is {y%ld GP{G.{x\n\r",
amount, (amount / 100), ch->pcdata->balance );
send_to_char( buf, ch );
do_save( ch, "" );
return;
}
}
/* If you want to have an invest option... define BANK_INVEST */
#if defined BANK_INVEST
if ((time_info.hour < 9) || (time_info.hour > 17))
{
send_to_char( "{RThe stock market is closed, it is open from {W9am {Rto {W5pm{R.{x\n\r", ch);
return;
}
if ( !str_prefix( arg1, "buy1" ) )
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( (amount * share_value1) > ch->pcdata->balance )
{
sprintf( buf, "{W%d {Rtype I shares will cost you {y%d{R, get more money.{x\n\r",
amount, (amount * share_value1) );
do_say(mob, buf);
return;
}
if (amount < 0 )
{
do_say(mob, "{RIf you want to sell shares you have to say so...{x");
return;
}
ch->pcdata->balance -= (amount * share_value1);
ch->pcdata->shares1 += amount;
sprintf( buf, "{GYou buy {W%d {Gtype I shares for {y%d GP{G, you now have {W%d {Gtype I shares.{x\n\r",
amount, (amount * share_value1), ch->pcdata->shares1 );
do_say(mob, buf);
do_save( ch, "" );
return;
}
}
if ( !str_prefix( arg1, "buy2" ) )
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( (amount * share_value2) > ch->pcdata->balance )
{
sprintf( buf, "{W%d {Rtype II shares will cost you {y%d{R, get more money.{x\n\r",
amount, (amount * share_value2) );
do_say(mob, buf);
return;
}
if (amount < 0 )
{
do_say(mob, "{RIf you want to sell shares you have to say so...{x");
return;
}
ch->pcdata->balance -= (amount * share_value2);
ch->pcdata->shares2 += amount;
sprintf( buf, "{GYou buy {W%d {Gtype II shares for {y%d GP{G, you now have {W%d {Gtype II shares.{x\n\r",
amount, (amount * share_value2), ch->pcdata->shares2 );
do_say(mob, buf);
do_save( ch, "" );
return;
}
}
if ( !str_prefix( arg1, "buy3" ) )
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( (amount * share_value3) > ch->pcdata->balance )
{
sprintf( buf, "{W%d {Rtype III shares will cost you {y%d{R, get more money.{x\n\r",
amount, (amount * share_value3) );
do_say(mob, buf);
return;
}
if (amount < 0 )
{
do_say(mob, "{RIf you want to sell shares you have to say so...{x");
return;
}
ch->pcdata->balance -= (amount * share_value3);
ch->pcdata->shares3 += amount;
sprintf( buf, "{GYou buy {W%d {Gtype III shares for {y%d GP{G, you now have {W%d {Gtype III shares.{x\n\r",
amount, (amount * share_value3), ch->pcdata->shares3 );
do_say(mob, buf);
do_save( ch, "" );
return;
}
}
if ( !str_prefix( arg1, "buy4" ) )
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( (amount * share_value4) > ch->pcdata->balance )
{
sprintf( buf, "{W%d {Rtype IV shares will cost you {y%d{R, get more money.{x\n\r",
amount, (amount * share_value4) );
do_say(mob, buf);
return;
}
if (amount < 0 )
{
do_say(mob, "{RIf you want to sell shares you have to say so...{x");
return;
}
ch->pcdata->balance -= (amount * share_value4);
ch->pcdata->shares4 += amount;
sprintf( buf, "{GYou buy {W%d {Gtype IV shares for {y%d GP{G, you now have {W%d {Gtype IV shares.{x\n\r",
amount, (amount * share_value4), ch->pcdata->shares4 );
do_say(mob, buf);
do_save( ch, "" );
return;
}
}
if ( !str_prefix( arg1, "sell1" ) )
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( amount > ch->pcdata->shares1 )
{
sprintf( buf, "{RYou only have {W%d {Rtype I shares.{x\n\r", ch->pcdata->shares1 );
do_say(mob, buf);
return;
}
if (amount < 0 )
{
do_say (mob, "{RIf you want to buy shares you have to say so...{x");
return;
}
ch->pcdata->balance += (amount * share_value1);
ch->pcdata->shares1 -= amount;
sprintf( buf, "{GYou sell {W%d {Gtype I shares for {y%d GP{G, you now have {W%d {Gtype I shares.{x\n\r",
amount, (amount * share_value1), ch->pcdata->shares1 );
do_say (mob, buf);
do_save( ch, "" );
return;
}
}
if ( !str_prefix( arg1, "sell2" ) )
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( amount > ch->pcdata->shares2 )
{
sprintf( buf, "{RYou only have {W%d {Rtype II shares.{x\n\r", ch->pcdata->shares2 );
do_say(mob, buf);
return;
}
if (amount < 0 )
{
do_say (mob, "{RIf you want to buy shares you have to say so...{x");
return;
}
ch->pcdata->balance += (amount * share_value2);
ch->pcdata->shares2 -= amount;
sprintf( buf, "{GYou sell {W%d {Gtype II shares for {y%d GP{G, you now have {W%d {Gtype II shares.{x\n\r",
amount, (amount * share_value2), ch->pcdata->shares2 );
do_say (mob, buf);
do_save( ch, "" );
return;
}
}
if ( !str_prefix( arg1, "sell3" ) )
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( amount > ch->pcdata->shares3 )
{
sprintf( buf, "{RYou only have {W%d {Rtype III shares.{x\n\r", ch->pcdata->shares3 );
do_say(mob, buf);
return;
}
if (amount < 0 )
{
do_say (mob, "{RIf you want to buy shares you have to say so...{x");
return;
}
ch->pcdata->balance += (amount * share_value3);
ch->pcdata->shares3 -= amount;
sprintf( buf, "{GYou sell {W%d {Gtype III shares for {y%d GP{G, you now have {W%d {Gtype III shares.{x\n\r",
amount, (amount * share_value3), ch->pcdata->shares3 );
do_say (mob, buf);
do_save( ch, "" );
return;
}
}
if ( !str_prefix( arg1, "sell4" ) )
{
int amount;
if ( is_number ( arg2 ) )
{
amount = atoi( arg2 );
if ( amount > ch->pcdata->shares4 )
{
sprintf( buf, "{RYou only have {W%d {Rtype IV shares.{x\n\r", ch->pcdata->shares4 );
do_say(mob, buf);
return;
}
if (amount < 0 )
{
do_say (mob, "{RIf you want to buy shares you have to say so...{x");
return;
}
ch->pcdata->balance += (amount * share_value4);
ch->pcdata->shares4 -= amount;
sprintf( buf, "{GYou sell {W%d {Gtype IV shares for {y%d GP{G, you now have {W%d {Gtype IV shares.{x\n\r",
amount, (amount * share_value4), ch->pcdata->shares4 );
do_say (mob, buf);
do_save( ch, "" );
return;
}
}
if ( !str_prefix( arg1, "check" ) )
{
sprintf (buf, "{GThe current shareprice for type {WI {Gshares is {y%d GP{G.{x\n\r",share_value1);
do_say(mob, buf);
sprintf (buf, "{GThe current shareprice for type {WII {Gshares is {y%d GP{G.{x\n\r",share_value2);
do_say(mob, buf);
sprintf (buf, "{GThe current shareprice for type {WIII {Gshares is {y%d GP{G.{x\n\r",share_value3);
do_say(mob, buf);
sprintf (buf, "{GThe current shareprice for type {WIV {Gshares is {y%d GP{G.{x\n\r",share_value4);
do_say(mob, buf);
if ((ch->pcdata->shares1) || (ch->pcdata->shares2)
|| (ch->pcdata->shares3) || (ch->pcdata->shares4))
{
sprintf (buf, "{GYou currently have {W%d {Gtype I shares, {C({W%d {Ga share{C) {Gworth a total of {y%d gold{G.{x\n\r",
ch->pcdata->shares1, share_value1, (ch->pcdata->shares1 * share_value1) );
do_say(mob, buf);
sprintf (buf, "{GYou currently have {W%d {Gtype II shares, {C({W%d {Ga share{C) {Gworth a total of {y%d gold{G.{x\n\r",
ch->pcdata->shares2, share_value2, (ch->pcdata->shares2 * share_value2) );
do_say(mob, buf);
sprintf (buf, "{GYou currently have {W%d {Gtype III shares, {C({W%d {Ga share{C) {Gworth a total of {y%d gold{G.{x\n\r",
ch->pcdata->shares3, share_value4, (ch->pcdata->shares3 * share_value3) );
do_say(mob, buf);
sprintf (buf, "{GYou currently have {W%d {Gtype IV shares, {C({W%d {Ga share{C) {Gworth a total of {y%d gold{G.{x\n\r",
ch->pcdata->shares4, share_value4, (ch->pcdata->shares4 * share_value4) );
do_say(mob, buf);
}
return;
}
#endif
do_say(mob, "{RI don't know what you mean{x");
do_bank( ch, "" );
/* Generate Instructions */
return;
}