/****************************************************************************
* ResortMUD Version 5.0 was mainly programmed by Ntanel, Garinan, Josh, *
* Badastaz, Digifuzz, Senir, Kratas, Scion, Shogar and Tagith. *
* ------------------------------------------------------------------------ *
* Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld of Lorain, *
* Ohio. ALL RIGHTS RESERVED See /doc/RMLicense.txt for more details. *
****************************************************************************/
/****************************************************************************
* [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | \\._.// *
* -----------------------------------------------------------| (0...0) *
* SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by Derek Snider | ).:.( *
* -----------------------------------------------------------| {o o} *
* SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, | / ' ' \ *
* Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek, |~'~.VxvxV.~'~*
* Tricops and Fireblade | *
* ------------------------------------------------------------------------ *
* Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* ------------------------------------------------------------------------ *
* Smaug banking support module *
****************************************************************************/
/***************************************************************************
* SMAUG Banking Support Code *
***************************************************************************
* *
* This code may be used freely, as long as credit is given in the help *
* file. Thanks. *
* *
* -= Minas Ravenblood =- *
* Implementor of The Apocalypse Theatre *
* (email: krisco7@hotmail.com) *
* *
***************************************************************************/
/* Modifications to original source by Samson */
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"
/* You can add this or just put it in the do_bank code. I don't really know
why I made a seperate function for this, but I did. If you do add it,
don't forget to declare it - Minas */
/* Finds banker mobs in a room. Installed by Samson on unknown date */
/* NOTE: Smaug 1.02a Users - Your compiler probably died on this
function - if so, remove the x in front of IS_SET and recompile */
/* Local functions for new money system -Garinan */
int goldamount args( (int tmpvalue) );
int silvamount args( (int tmpvalue) );
CHAR_DATA *find_banker( CHAR_DATA *ch )
{
CHAR_DATA *banker;
for ( banker = ch->in_room->first_person; banker; banker = banker->next_in_room )
if ( IS_NPC( banker ) && xIS_SET( banker->act, ACT_BANKER ) )
break;
return banker;
}
/* SMAUG Bank Support
* Coded by Minas Ravenblood for The Apocalypse Theatre
* (email: krisco7@hotmail.com)
*/
/* Installed by Samson on unknown date */
/* Deposit, withdraw, balance and transfer commands */
void do_deposit( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *banker;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
bool isgold = FALSE;
bool issilver = FALSE;
bool iscopper = FALSE;
int amount;
int newamount;
if ( !( banker = find_banker( ch ) ) )
{
send_to_char( "&WYou're not in a bank!&w\n\r", ch );
return;
}
if ( IS_NPC( ch ) )
{
sprintf( buf, "Sorry, %s, we don't do business with mobs.", ch->short_descr );
do_say( banker, buf );
return;
}
if ( argument[0] == '\0' )
{
do_say( banker, "If you need help, see HELP BANK." );
return;
}
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1 == '\0' )
{
sprintf( buf, "%s How much do you wish to deposit?", ch->name );
do_tell( banker, buf );
return;
}
if ( str_cmp( arg1, "all" ) && !is_number( arg1 ) )
{
sprintf( buf, "%s How much do you wish to deposit?", ch->name );
do_tell( banker, buf );
return;
}
/* New Money System -Garinan */
if ( arg2 == '\0' )
{
sprintf( buf, "%s You must specify gold, silver, or copper.", ch->name );
do_tell( banker, buf );
return;
}
if ( !str_cmp(arg2, "gold") )
isgold = TRUE;
else if ( !str_cmp(arg2, "silver") )
issilver = TRUE;
else if ( !str_cmp(arg2, "copper") )
iscopper = TRUE;
else
{
sprintf( buf, "%s I don't trade in that currency.", ch->name );
do_tell( banker, buf );
return;
}
if ( !str_cmp( arg1, "all" ) )
isgold ? (amount = ch->gold) : issilver ? (amount = ch->silver) : (amount = ch->copper);
else
amount = atoi( arg1 );
if ( ( amount > ch->gold && isgold ) || ( amount > ch->silver && issilver ) || ( amount > ch->copper && iscopper ) )
{
sprintf( buf, "%s Sorry, but you don't have that much %s to deposit.", ch->name, isgold ? "gold" : issilver ? "silver" :
"copper" );
do_tell( banker, buf );
return;
}
if ( amount <= 0 )
{
sprintf( buf, "%s Oh, I see.. I didn't know i was doing business with a comedian.", ch->name );
do_tell( banker, buf );
return;
}
if( !IS_IMMORTAL( ch ) )
{
if( ch->pcdata->balance == 5000000 )
{
do_tell( banker, "You can't deposit more than 5,000,000 coins!" );
return;
}
if( ch->pcdata->balance + amount > 5000000 )
amount = 5000000 - ch->pcdata->balance;
}
if (isgold)
{
ch->gold -= amount;
newamount = get_value(amount,0,0);
}
else if (issilver)
{
ch->silver -= amount;
newamount = get_value(0,amount,0);
}
else if (iscopper)
{
ch->copper -= amount;
newamount = get_value(0,0,amount);
}
else
{
bug("Invalid money type in banks. Error code: Er21301 Please report this code to Garinan.");
return;
}
/* This is ugly, but i'm tired -Garinan */
if (( ch->pcdata->balance + newamount) <= 0 || (ch->pcdata->balance + newamount) > 200000000)
{
sprintf( buf, "%s Your account has reached its limit.", ch->name );
do_tell( banker, buf );
newamount = 0;
ch->pcdata->balance = 200000000;
}
ch->pcdata->balance += newamount;
sprintf( buf, "You deposit %d %s coin%s.\n\r", amount, isgold ? "gold" : issilver ? "silver" : "copper" ,(amount != 1) ?
"s" : "" );
set_char_color( AT_WHITE, ch );
send_to_char( buf, ch );
sprintf( buf, "$n deposits %d %s coin%s.\n\r", amount, isgold ? "gold" : issilver ? "silver" : "copper" ,(amount != 1) ?
"s" : "" );
act( AT_WHITE, buf, ch, NULL, NULL, TO_ROOM );
return;
}
void do_withdraw( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *banker;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
bool isgold = FALSE;
bool issilver = FALSE;
bool iscopper = FALSE;
int amount;
int thebalance;
int newamount;
if ( !( banker = find_banker( ch ) ) )
{
send_to_char( "&WYou're not in a bank!&w\n\r", ch );
return;
}
if ( IS_NPC( ch ) )
{
sprintf( buf, "Sorry, %s, we don't do business with mobs.", ch->short_descr );
do_say( banker, buf );
return;
}
if ( argument[0] == '\0' )
{
do_say( banker, "If you need help, see HELP BANK." );
return;
}
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1 == '\0' )
{
sprintf( buf, "%s How much do you wish to withdraw?", ch->name );
do_tell( banker, buf );
return;
}
if ( str_cmp( arg1, "all" ) && !is_number( arg1 ) )
{
sprintf( buf, "%s How much do you wish to withdraw?", ch->name );
do_tell( banker, buf );
return;
}
if ( arg2 == '\0' || (str_cmp(arg2, "gold") && str_cmp(arg2, "silver") && str_cmp(arg2, "copper") ) )
{
sprintf( buf, "%s You must specify gold, silver, or copper.", ch->name );
do_tell( banker, buf );
return;
}
if ( !str_cmp(arg2, "gold") )
{
isgold = TRUE;
thebalance = goldamount(ch->pcdata->balance);
}
else if ( !str_cmp(arg2, "silver") )
{
issilver = TRUE;
thebalance = silvamount(ch->pcdata->balance);
}
else if ( !str_cmp(arg2, "copper") )
{
iscopper = TRUE;
thebalance = ch->pcdata->balance;
}
else
{
bug( "Invalid money type in banks. Error code: Er21302 Please report this code to Garinan." );
return;
}
if ( !str_cmp( arg1, "all" ) )
amount = ch->pcdata->balance;
else
amount = atoi( arg1 );
if ( amount > thebalance )
{
sprintf( buf, "%s But you do not have that much %s in your account!", ch->name, isgold ? "gold" : issilver ? "silver" :
"copper" );
do_tell( banker, buf );
return;
}
if ( amount <= 0 )
{
sprintf( buf, "%s Oh I see.. I didn't know i was doing business with a comedian.", ch->name );
do_tell( banker, buf );
return;
}
if (iscopper)
{
ch->pcdata->balance -= amount;
ch->copper += amount;
}
else if (isgold)
{
newamount = get_value(amount,0,0);
ch->pcdata->balance -= newamount;
ch->gold += amount;
}
else if (issilver)
{
newamount = get_value(0,amount,0);
ch->pcdata->balance -= newamount;
ch->silver += amount;
}
else
{
bug( "Invalid money type in banks. Error code: Er21303 Please report this code to Garinan." );
return;
}
sprintf( buf, "You withdraw %d %s coin%s.\n\r", amount, isgold ? "gold" : issilver ? "silver" : "copper", (amount != 1) ?
"s" : "" );
set_char_color( AT_WHITE, ch );
send_to_char( buf, ch );
sprintf( buf, "$n withdraws %d %s coin%s.\n\r", amount, isgold ? "gold" : issilver ? "silver" : "copper", (amount != 1) ?
"s" : "" );
act( AT_WHITE, buf, ch, NULL, NULL, TO_ROOM );
return;
}
void do_balance( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *banker;
char buf [MAX_STRING_LENGTH];
int silvies;
int goldies;
if ( !( banker = find_banker( ch ) ) )
{
send_to_char( "&WYou're not in a bank!&w\n\r", ch );
return;
}
if ( IS_NPC( ch ) )
{
sprintf( buf, "Sorry, %s, we don't do business with mobs.", ch->short_descr );
do_say( banker, buf );
return;
}
goldies = goldamount(ch->pcdata->balance);
silvies = silvamount(ch->pcdata->balance);
set_char_color( AT_WHITE, ch );
send_to_char( "Your account value is:\n\r", ch);
sprintf( buf, "&YGold: %d.\n\r&WSilver: %d.\n\r&RCopper: %d.\n\r\n\r", goldies, silvies, ch->pcdata->balance);
send_to_char( buf, ch );
return;
}
void do_transfer( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *banker;
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
bool isgold = FALSE;
bool issilver = FALSE;
bool iscopper = FALSE;
char buf [MAX_STRING_LENGTH];
int amount;
int thebalance;
int newamount;
if ( !( banker = find_banker( ch ) ) )
{
send_to_char( "&WYou're not in a bank!&w\n\r", ch );
return;
}
if ( IS_NPC( ch ) )
{
sprintf( buf, "Sorry, %s, we don't do business with mobs.", ch->short_descr );
do_say( banker, buf );
return;
}
if ( argument[0] == '\0' )
{
do_say( banker, "If you need help, see HELP BANK." );
return;
}
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if ( arg1 == '\0' || arg2 == '\0' || arg3 == '\0')
{
sprintf( buf, "%s How much do you wish to send to who?", ch->name );
do_tell( banker, buf );
return;
}
if ( str_cmp( arg1, "all" ) && !is_number( arg1 ) )
{
sprintf( buf, "%s How much do you wish to send to who?", ch->name );
do_tell( banker, buf );
return;
}
if (!str_cmp(arg2, "gold") )
{
isgold = TRUE;
thebalance = goldamount(ch->pcdata->balance);
}
else if (!str_cmp(arg2, "silver") )
{
issilver = TRUE;
thebalance = silvamount(ch->pcdata->balance);
}
else if (!str_cmp(arg2, "copper") )
{
iscopper = TRUE;
thebalance = ch->pcdata->balance;
}
else
{
sprintf( buf, "%s I don't trade in that currency.", ch->name );
do_tell( banker, buf );
return;
}
if ( !( victim = get_char_world( ch, arg3 ) ) )
{
sprintf( buf, "%s %s could not be located.", ch->name, capitalize(arg2) );
do_tell( banker, buf );
return;
}
if ( IS_NPC( victim ) )
{
sprintf( buf, "%s We do not do business with mobiles...", ch->name );
do_tell( banker, buf );
return;
}
if ( !str_cmp( arg1, "all" ) )
amount = ch->pcdata->balance;
else
amount = atoi( arg1 );
if ( amount > thebalance )
{
sprintf( buf, "%s You are very generous, but you don't have that much gold!", ch->name );
do_tell( banker, buf );
return;
}
if ( amount <= 0 )
{
sprintf( buf, "%s Oh I see.. I didn't know I was doing business with a comedian.", ch->name );
do_tell( banker, buf );
return;
}
if (isgold)
newamount = get_value(amount,0,0);
else if (issilver)
newamount = get_value(amount,0,0);
else if (iscopper)
newamount = amount;
else
{
bug( "Invalid money type in banks. Error code: Er21303 Please report this code to Garinan." );
return;
}
ch->pcdata->balance -= newamount;
victim->pcdata->balance += newamount;
sprintf( buf, "You transfer %d %s coin%s to %s's bank account.\n\r",
amount, isgold ? "gold" : issilver ? "silver" : "copper", (amount != 1) ? "s" : "", victim->name );
set_char_color( AT_WHITE, ch );
send_to_char( buf, ch );
sprintf( buf, "%s just transferred %d %s coin%s to your bank account.\n\r",
ch->name, amount, isgold ? "gold" : issilver ? "silver" : "copper", (amount != 1) ? "s" : "" );
set_char_color( AT_WHITE, victim );
send_to_char( buf, victim );
return;
}
/* End of new bank support */
/* A couple functions required for banking with new money -Garinan */
int goldamount (int tmpvalue)
{
int goldies;
goldies = tmpvalue/10000;
return goldies;
}
int silvamount (int tmpvalue)
{
int silvies;
silvies = tmpvalue/100;
return silvies;
}