/**************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefiting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************
* 1stMud ROM Derivative (c) 2001-2004 by Markanth *
* http://www.firstmud.com/ <markanth@firstmud.com> *
* By using this code you have agreed to follow the term of *
* the 1stMud license in ../doc/1stMud/LICENSE *
***************************************************************************/
#include "merc.h"
#include "data_table.h"
#define MAX_SHARES 10000
Do_Fun(do_balance)
{
chprintlnf(ch,
"Balance : %ld gold" NEWLINE "On Hand : %ld gold, %ld silver"
NEWLINE "Shares : %d gold in %d shares",
ch->pcdata->gold_bank, ch->gold, ch->silver,
(ch->pcdata->shares * mud_info.share_value),
ch->pcdata->shares);
}
Do_Fun(do_bank)
{
char arg1[MIL];
char arg2[MIL];
money_t amount;
ClanData *clan;
bool QP = false;
if (!ch)
return;
if (IsNPC(ch))
{
chprintln(ch, "Banking Services are only available to players!");
return;
}
if (!IsSet(ch->in_room->room_flags, ROOM_BANK))
{
chprintln(ch, "You can't do that here.");
return;
}
clan = ch->in_room->area->clan;
if (!clan && (time_info.hour < 4 || time_info.hour > 20))
{
chprintln(ch, "The bank is closed, it is open from 4am to 8pm.");
return;
}
if (NullStr(argument))
{
cmd_syntax(ch, NULL, n_fun, "balance : Displays your balance.",
"deposit : Deposit gold into your account.",
"withdraw : Withdraw gold from your account.", NULL);
if (!clan)
{
cmd_syntax(ch, NULL, n_fun,
"transfer : Transfer gold to someones account.",
"buy # : Buy # shares", "sell # : Sell # shares",
"check : Check the current rates of the shares.",
NULL);
}
return;
}
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
#define MAX_QP 32000
#define MAX_GOLD 99999999
#define MAX_MONEY (!QP ? (money_t) MAX_GOLD : (money_t) MAX_QP)
#define getbalance (!clan ? ch->pcdata->gold_bank : QP ? (money_t)clan->questpoints : clan->gold)
#define paywith ((clan && QP) ? (ch->pcdata->quest.points >= (int)amount) \
: check_worth(ch, amount, VALUE_DEFAULT))
#define getpay (!clan ? ch->gold : QP ? ch->pcdata->quest.points \
: ch->gold)
#define paybank do { if(!clan) ch->gold = Max(0, ch->gold - amount); \
else if(QP) ch->pcdata->quest.points = Max(0, ch->pcdata->quest.points - (int)amount); \
else deduct_cost(ch, amount, VALUE_DEFAULT); } while(0)
#define paychar do { if(!QP) ch->gold = Min(MAX_GOLD, ch->gold + amount); \
else ch->pcdata->quest.points = Min(MAX_QP, ch->pcdata->quest.points + (int)amount); } while(0)
#define paytype (!QP ? "gold" : "quest points")
if (!str_prefix(arg1, "balance"))
{
if (!clan)
do_balance(n_fun, ch, "");
else
chprintlnf(ch, "%s balance: %ld gold, %ld questpoints.",
clan->name, clan->gold, clan->questpoints);
return;
}
if (!str_prefix(arg1, "deposit"))
{
if (NullStr(arg2))
{
chprintln(ch, "Deposit how much?");
return;
}
if (clan)
{
if (NullStr(argument))
{
cmd_syntax(ch, NULL, n_fun, "deposit <amount> qp|gold", NULL);
return;
}
QP = !str_cmp(argument, "qp");
}
if (str_cmp(arg2, "all"))
amount = advatoi(arg2);
else
amount = getpay;
if (!paywith)
{
chprintlnf(ch,
"How can you deposit %ld %s when you only have %ld %s?",
amount, paytype, getpay, paytype);
return;
}
if (amount <= 0)
{
chprintlnf(ch, "Only positive figures are allowed.");
return;
}
if (amount >= MAX_MONEY)
{
chprintlnf(ch,
"I'm sorry, our accounts can only hold up to %d %s!",
MAX_MONEY, paytype);
return;
}
paybank;
if (!clan)
ch->pcdata->gold_bank = Max(0, ch->pcdata->gold_bank + amount);
else if (QP)
clan->questpoints = Max(0, clan->questpoints + amount);
else
clan->gold = Max(0, clan->gold + amount);
chprintlnf(ch, "You deposit %ld %s. Your new %sbalance is %ld %s.",
amount, paytype, clan ? "clan " : "", getbalance, paytype);
if (clan)
{
rw_clan_data(act_write);
if (is_clan(ch) && clan == CharClan(ch))
{
ClanMember *curr;
for (curr = mbr_first; curr != NULL; curr = curr->next)
{
if (!str_cmp(ch->name, curr->name))
{
if (!QP)
curr->gold_donated =
Range(0, curr->gold_donated + amount,
MAX_MONEY);
else
curr->qp_donated += amount;
rw_mbr_data(act_write);
break;
}
}
}
}
return;
}
if (!str_prefix(arg1, "withdraw"))
{
if (clan && (clan != CharClan(ch) || !is_leader(ch))
&& !IsImmortal(ch))
{
chprintln(ch,
"You have to be a clan leader to withdraw from the clan bank.");
return;
}
if (NullStr(arg2))
{
chprintln(ch, "Withdraw how much?");
return;
}
if (clan)
{
if (NullStr(argument))
{
cmd_syntax(ch, NULL, n_fun, "withdraw <amount> qp|gold",
NULL);
return;
}
QP = !str_cmp(argument, "qp");
}
if (str_cmp(arg2, "all"))
amount = advatoi(arg2);
else
amount = getbalance;
if (getbalance < amount)
{
chprintlnf(ch,
"How can you withdraw %ld %s when your %sbalance is %ld %s?",
amount, paytype, clan ? "clan " : "", getbalance,
paytype);
return;
}
if (amount <= 0)
{
chprintlnf(ch, "Only positive figures are allowed.");
return;
}
if (getpay + amount >= MAX_MONEY)
{
chprintlnf(ch, "I'm sorry you can only carry %d %s!", MAX_MONEY,
paytype);
return;
}
if (!clan)
ch->pcdata->gold_bank = Max(0, ch->pcdata->gold_bank - amount);
else if (QP)
clan->questpoints = Max(0, clan->questpoints - amount);
else
clan->gold = Max(0, clan->gold - amount);
paychar;
chprintlnf(ch, "You withdraw %ld %s. Your new %sbalance is %ld %s.",
amount, paytype, clan ? "clan " : "", getbalance, paytype);
return;
}
if (clan)
{
do_bank(n_fun, ch, "");
return;
}
if (!str_prefix(arg1, "transfer"))
{
CharData *victim;
if (NullStr(arg2))
{
chprintln(ch, "Transfer how much?");
return;
}
if (str_cmp(arg2, "all"))
amount = advatoi(arg2);
else
amount = ch->pcdata->gold_bank;
if (amount > ch->pcdata->gold_bank)
{
chprintlnf(ch,
"How can you transfer %ld gold when your balance is %ld?",
amount, ch->pcdata->gold_bank);
return;
}
if (amount <= 0)
{
chprintlnf(ch, "Only positive figures are allowed.");
return;
}
if (!(victim = get_char_world(ch, argument)))
{
chprintlnf(ch, "%s doesn't have a bank account.",
capitalize(argument));
return;
}
if (IsNPC(victim))
{
chprintln(ch, "You can only transfer money to players.");
return;
}
if (victim->pcdata->gold_bank + amount >= MAX_MONEY)
{
chprintlnf(ch, "Sorry %s's account can't hold that much!",
GetName(victim));
return;
}
ch->pcdata->gold_bank = Max(0, ch->pcdata->gold_bank - amount);
victim->pcdata->gold_bank =
Max(0, victim->pcdata->gold_bank + amount);
chprintlnf(ch, "You transfer %ld gold. Your new balance is %ld gold.",
amount, ch->pcdata->gold_bank);
chprintlnf(victim,
"{g[{GBANK{g]{W %s has transferred {Y%ld{W gold to your account.{x",
Pers(ch, victim), amount);
return;
}
if (!str_prefix(arg1, "buy"))
{
unsigned int shares;
if (NullStr(arg2))
{
chprintln(ch, "Buy how many?");
return;
}
if (str_cmp(arg2, "all"))
shares = atoi(arg2);
else
shares = MAX_SHARES - ch->pcdata->shares;
if (ch->pcdata->shares + shares > MAX_SHARES)
{
chprintlnf(ch, "You can't buy more than %d shares.", MAX_SHARES);
return;
}
if ((shares * mud_info.share_value) > ch->pcdata->gold_bank)
{
chprintlnf(ch, "%d shares will cost you %d, deposit more money.",
shares, (shares * mud_info.share_value));
return;
}
if (shares <= 0)
{
chprintlnf(ch,
"If you want to sell shares you have to say so...");
return;
}
ch->pcdata->gold_bank =
Max(0, ch->pcdata->gold_bank - (shares * mud_info.share_value));
ch->pcdata->shares =
Range(0, ch->pcdata->shares + shares, MAX_SHARES);
chprintlnf(ch,
"You buy %d shares for %d gold, you now have %d shares.",
shares, (shares * mud_info.share_value),
ch->pcdata->shares);
return;
}
if (!str_prefix(arg1, "sell"))
{
int shares;
if (NullStr(arg2))
{
chprintln(ch, "Sell how many shares?");
return;
}
if (str_cmp(arg2, "all"))
shares = atoi(arg2);
else
shares = ch->pcdata->shares;
if (shares > ch->pcdata->shares)
{
chprintlnf(ch, "You only have %d shares.", ch->pcdata->shares);
return;
}
if (shares <= 0)
{
chprintlnf(ch, "If you want to buy shares you have to say so...");
return;
}
if (ch->pcdata->gold_bank + (shares * mud_info.share_value) >=
MAX_MONEY)
ch->pcdata->gold_bank = MAX_MONEY;
else
ch->pcdata->gold_bank =
Max(0,
ch->pcdata->gold_bank + (shares * mud_info.share_value));
ch->pcdata->shares = Max(0, ch->pcdata->shares - shares);
chprintlnf(ch,
"You sell %d shares for %d gold, you now have %d shares.",
shares, (shares * mud_info.share_value),
ch->pcdata->shares);
return;
}
if (!str_prefix(arg1, "check"))
{
chprintlnf(ch, "The current shareprice is %d.", mud_info.share_value);
if (ch->pcdata->shares)
{
chprintlnf(ch,
"You currently have %d shares, (%d a share) worth a total of %d gold.",
ch->pcdata->shares, mud_info.share_value,
(ch->pcdata->shares * mud_info.share_value));
}
return;
}
do_bank(n_fun, ch, "");
return;
}
money_t net_worth(CharData * ch)
{
if (!ch)
return 0;
else if (IsNPC(ch))
return ch->gold;
else
return (ch->silver + 100 * ch->gold) + ch->pcdata->gold_bank +
(ch->pcdata->shares * mud_info.share_value);
}
bool check_worth(CharData * ch, money_t amount, currency_t type)
{
switch (type)
{
default:
case VALUE_SILVER:
return (ch->silver + (100 * ch->gold) >= amount);
case VALUE_GOLD:
return (ch->gold >= amount);
}
}
Do_Fun(do_tax)
{
char arg[MIL];
CharData *vict;
int p;
money_t net, tax;
argument = one_argument(argument, arg);
if (NullStr(arg))
{
cmd_syntax(ch, NULL, n_fun, "<char> <percentange>", NULL);
return;
}
if ((vict = get_char_world(ch, arg)) == NULL)
{
chprintln(ch, "No such character.");
return;
}
if (!is_number(argument) || (p = atoi(argument)) < 1 || p > 100)
{
chprintln(ch, "Percentage should be between 1 and 100.");
return;
}
net = (vict->silver + (100 * vict->gold));
if (!net)
{
act("$N has to money to tax.", ch, NULL, vict, TO_CHAR);
return;
}
tax = net * p / 100;
deduct_cost(vict, tax, VALUE_DEFAULT);
chprintlnf(vict,
"A small man holding an elaborite ledger appears in front of you quite suddenly,"
" and politely informs you the council has taxed you %ld coin, refusal to pay such fee, will be"
" dealt with quickly.", tax);
chprintlnf(ch, "You tax %s %s.", GetName(vict),
cost_str(tax, VALUE_DEFAULT));
}