/
Cool3/bin/
/*
 * The Mythran Mud Economy Snippet Version 2 (used to be banking.c)
 *
 * Copyrights and rules for using the economy system:
 *
 *      The Mythran Mud Economy system was written by The Maniac, it was
 *      loosly based on the rather simple 'Ack!'s banking system'
 *
 *      If you use this code you must follow these rules.
 *              -Keep all the credits in the code.
 *              -Mail Maniac (v942346@si.hhs.nl) to say you use the code
 *              -Send a bug report, if you find 'it'
 *              -Credit me somewhere in your mud.
 *              -Follow the envy/merc/diku license
 *              -If you want to: send me some of your code
 *
 * All my snippets can be found on http://www.hhs.nl/~v942346/snippets.html
 * Check it often because it's growing rapidly  -- Maniac --
 */

#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 <string.h>
#include <stdlib.h>
#include "merc.h"
#include "recycle.h"
#include "tables.h"
#include "lookup.h"

int     share_value = SHARE_VALUE;      /* External share_value by Maniac */

DECLARE_DO_FUN( do_say		);

void do_bank( CHAR_DATA *ch, char *argument )
{
        /* The Mythran mud economy system (bank and trading)
        *
        * based on:
        * Simple banking system. by -- Stephen --
        *
        * The following changes and additions where
        * made by the Maniac from Mythran Mud
        * (v942346@si.hhs.nl)
        *
        * History:
        * 18/05/96:     Added the transfer option, enables chars to transfer
        *               money from their account to other players' accounts
        * 18/05/96:     Big bug detected, can deposit/withdraw/transfer
        *               negative amounts (nice way to steal is
        *               bank transfer -(lots of dogh)
        *               Fixed it (thought this was better... -= Maniac =-)
        * 21/06/96:     Fixed a bug in transfer (transfer to MOBS)
        *               Moved balance from ch->balance to ch->pcdata->balance
        * 21/06/96:     Started on the invest option, so players can invest
        *               money in shares, using buy, sell and check
        *               Finished version 1.0 releasing it monday 24/06/96
        * 24/06/96:     Mythran Mud Economy System V1.0 released by Maniac
        *
        */
	/*
	BUG FIXES:
	* 23/07/97:	Make it less screwy in general by fixing it so that
	*		do_say actually executes, plus cleaned up some of
	*		the unnessecary \n\r's.  --Jouster
	*/

        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( "Banking Services are only available to players!\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 ) )
		*/
		/*
		   Ran out of ACT_ bits... but besides, how do you
		   have more than one banker with access to >>EXACT<<
		   same account?
		*/
		if ( IS_NPC(mob) )
		    if ( mob->pIndexData->vnum == MOB_VNUM_BANKER )
                        break;
        }

        if ( mob == NULL )
        {
                send_to_char( "You can't do that here.\n\r", ch );
                return;
        }

        if ( argument[0] == '\0' )
        {
                send_to_char( "Bank Options:\n\r\n\r", ch );
                send_to_char( "Bank balance: Displays your balance.\n\r", ch );
                send_to_char( "Bank deposit : Deposit platinum into your account.\n\r", ch );
                send_to_char( "Bank withdraw : Withdraw platinum from your account.\n\r", ch ); 
#if defined BANK_TRANSFER
                send_to_char( "Bank transfer  : Transfer platinum to account.\n\r", ch);
#endif
#if defined BANK_INVEST
                send_to_char( "Bank buy #: Buy # shares\n\r", ch);
                send_to_char( "Bank sell #: Sell # shares\n\r", ch);
                send_to_char( "Bank check: Check the current rates of the shares.\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" ) )
        {
                sprintf(buf,"Your current balance is: %d Platinum.",ch->pcdata->balance );
                do_say(mob, buf);
                return;
        }

        if ( !str_prefix( arg1, "deposit" ) )
        {
                int amount;

                if ( is_number ( arg2 ) )
                {
                        amount = atoi( arg2 );
			if ( amount < 0 || amount > 32000 
			   || (amount + ch->pcdata->balance > 32000 ) )
			{
			    send_to_char( "You can only deposit up to 32,000 platinum.\n\r", ch );
			    return;
			}

                        if (amount > ch->platinum )
                        {
                                sprintf( buf, "How can you deposit %d Platinum when you only have %ld?", amount, ch->platinum );
                                do_say(mob, buf );
                                return;
                        }

                        if (amount < 0 )
                        {
                                do_say (mob, "Only positive amounts allowed...");
                                return;
                        }

                        ch->platinum -= amount;
                        ch->pcdata->balance += amount;
                        sprintf ( buf, "You deposit %d Platinum.  Your new balance is %d Platinum.\n\r",
                        amount, ch->pcdata->balance );
                        send_to_char( buf, 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, "How can you transfer %d Platinum when your balance is %d?",
                                amount, ch->pcdata->balance );
                                do_say( mob, buf);
                                return;
                        }

                        if (amount < 0 )
                        {
                                do_say (mob, "Only positive amounts allowed...");
                                return;
                        }

                        if ( !( victim = get_char_world( ch, argument ) ) )
                        {
                                sprintf (buf, "%s doesn't have a bank account.", argument );
                                do_say( mob, buf );
                                return;
                        }

                        if (IS_NPC(victim))
                        {
                                do_say( mob, "You can only transfer money to players.");
                                return;
                        }

                        ch->pcdata->balance     -= amount;
                        victim->pcdata->balance += amount;
                        sprintf( buf, "You transfer %d Platinum. Your new balance is %d Platinum.\n\r",
			amount, ch->pcdata->balance );
                        send_to_char( buf, ch );
                        sprintf (buf, "[BANK] %s has transferred %d Platinum's to your account.\n\r", ch->name, amount);
                        send_to_char( buf, victim );
                        return;
                }
        }
#endif

        if ( !str_prefix( arg1, "withdraw" ) )
        {
                int amount;

                if ( is_number ( arg2 ) )
                {
                        amount = atoi( arg2 );
                        if ( amount > ch->pcdata->balance )
                        {
                                sprintf( buf, "How can you withdraw %d Platinum when your balance is %d?",
                                amount, ch->pcdata->balance );
                                do_say (mob, buf );
                                return;
                        }

                        if (amount < 0 )
                        {
                                do_say( mob, "Only positive amounts allowed...");
                                return;
                        }

                        ch->pcdata->balance -= amount;
                        ch->platinum += amount;
                        sprintf( buf, "You withdraw %d Platinum.  Your new balance is %d Platinum.\n\r", amount, ch->pcdata->balance );
                        send_to_char( buf, ch );
                        return;
                }
        }

        /* If you want to have an invest option... define BANK_INVEST */

#if defined BANK_INVEST
        if ( !str_prefix( arg1, "buy" ) )
        {
                int amount;
		int oldgold=0;
		int oldbal=0;

                if ( is_number ( arg2 ) )
                {
                        amount = atoi( arg2 );

                        if ( amount > 100 )
                        {
                        send_to_char("You can only buy 100 shares at a time.\n\r", ch);
                        return;
                        }

                        TRANSFORM_TO_GOLD( ch, oldbal, oldgold );
                        if ( ( amount * share_value ) > ch->gold )
			{
                                sprintf( buf, "%d shares will cost you %d, put more money into your account.", amount, (amount * share_value) );
                                do_say(mob, buf);
				TRANSFORM_FROM_GOLD( ch, oldbal, oldgold );
                                return;
                        }

                        if (amount < 0 )
                        {
                                do_say(mob, "If you want to sell shares you have to say so...");
				TRANSFORM_FROM_GOLD( ch, oldbal, oldgold );
                                return;
                        }

                        ch->gold		-= (amount * share_value);
                        ch->pcdata->shares	+= amount;
                        sprintf( buf, "You buy %d shares for %d gold.  You now have %d shares.", amount, (amount * share_value), ch->pcdata->shares );
                        do_say(mob, buf);
			TRANSFORM_FROM_GOLD( ch, oldbal, oldgold );
                        return;
                }
        }

        if ( !str_prefix( arg1, "sell" ) )
        {
                int amount;

                if ( is_number ( arg2 ) )
                {

                        amount = atoi( arg2 );

                        if ( amount > 100 )
                        {
                        send_to_char("You can only sell 100 shares at a time.\n\r", ch);
			return;
                        }

                        if ( amount > ch->pcdata->shares )
                        {
                                sprintf( buf, "You only have %d shares.", ch->pcdata->shares );
                                do_say(mob, buf);
                                return;
                        }

                        if (amount < 0 )
                        {
                                do_say (mob, "If you want to buy shares you have to say so...");
                                return;
                        }

			add_cost( ch, (amount * share_value), VALUE_GOLD );
                        ch->pcdata->shares -= amount;
                        sprintf( buf, "You sell %d shares for %d gold, you now have %d shares.", amount, (amount * share_value), ch->pcdata->shares );
                        do_say (mob, buf);
                        return;
                }
        }

        if ( !str_prefix( arg1, "check" ) )
        {
                sprintf (buf, "The going rate for shares of CM is %d.",share_value);
                do_say(mob, buf);
                if (ch->pcdata->shares)
                {
                    sprintf (buf, "You have %d shares, (at %d a  share), with a total worth of %d gold.",
                        ch->pcdata->shares, share_value, (ch->pcdata->shares * share_value) );
                    do_say(mob, buf);
                }
                return;
        }
#endif

        do_say(mob, "I don't know what you mean");
        do_bank( ch, "" );              /* Generate Instructions */
        return;
}