ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/maps/perl/bank.ext
Revision: 1.19
Committed: Tue Jul 11 16:56:27 2006 UTC (17 years, 10 months ago) by elmex
Branch: MAIN
Changes since 1.18: +7 -8 lines
Log Message:
fixed bank bug where withdrawal could lead to money loss
when the player couldn't pick it up. it's now just inserted
the same way like the shops do it when they give you money for a sold item.

File Contents

# Content
1 #! perl
2
3 # The international bank script. There are five commands one can
4 # give the banker in-game:
5 # - help, will show the usage information
6 # - deposit, can deposit a certain amount of a given currency unit
7 # - withdraw, can give out a certain amount of a given currency unit
8 # provided, the bank account has this amount of money
9 # - exchange, will exchange between royalties and platinum coins
10 # - balance, simply shows how much money one has on his/her account.
11 #
12 # TODO:
13 # - Comment more steps
14 # - Implement exchange()
15
16 # The units are being used in each sub so they are declared globally.
17 my %unit = (
18 silver => 1,
19 gold => 10,
20 platina => 50,
21 royalty => 5000,
22 );
23
24 # Subroutine just to calculate exchange rates.
25 sub calc_exchange_rate {
26 my ($value, $from_cur, $to_cur) = @_;
27
28 $value * $unit{$from_cur} / $unit{$to_cur}
29 }
30
31 # Calculates and returns how much money someone has starting with the
32 # highest value currency going down. Think of it like having the date
33 # and time in the format of 2006-05-19 03:21:31 UTC instead of 1148001691
34 # seconds since 1970-01-01 00:00:00 UTC.
35 sub balance {
36 my ($who, $is_wiz) = @_;
37 my $balance = $who->{bank_balance};
38
39 unless ($is_wiz) {
40 return "Sorry, you have no balance."
41 unless $balance >= 1;
42 } else {
43 return $who->name." has no balance."
44 unless $balance >= 1;
45 }
46
47 my $royalties = calc_exchange_rate $balance, "silver", "royalty";
48 my $platinum = calc_exchange_rate $royalties - (int $royalties), "royalty", "platina";
49 my $gold = calc_exchange_rate $platinum - (int $platinum), "platina", "gold";
50 my $silver = calc_exchange_rate $gold - (int $gold), "gold", "silver";
51
52 my $account_info =
53 (int $royalties) . " royalties, "
54 . (int $platinum) . " platinum, "
55 . (int $gold) . " gold and about "
56 . (int $silver) ." silver coins.";
57
58 return "You have $account_info"
59 unless $is_wiz;
60
61 return $who->name." has $account_info";
62 }
63
64 sub transaction {
65 my ($who, $action, $amount, $currency) = @_;
66 my $pay = $amount * $unit{$currency};
67
68 return "We don't trade in that currency."
69 unless exists $unit{$currency};
70
71 return "You can not $action fractions."
72 unless $amount =~ /^\d+$/;
73
74 # First check for possible overflow and user stupidity
75 if ($amount > 2**31) {
76 return "Sorry, we do not handle that kind of money for one ".$action.".";
77 } elsif ($amount == 0) {
78 return "You can not ".$action." nothing.";
79 } elsif ($amount < 0) {
80 return "You can not ".$action." negative values.";
81 }
82
83 # Here we handle the transactions
84 if ($action eq "deposit") {
85 if ($who->pay_amount ($pay)) {
86 $who->{bank_balance} += $pay;
87 return "$amount $currency received.";
88 } else {
89 return "You don't have enough money with you.";
90 }
91 } elsif ($action eq "withdraw") {
92 if ($pay <= $who->{bank_balance}) {
93 my $paid = $who->pay_player_arch (
94 $currency eq 'royalty' ? 'royalty' : $currency . "coin",
95 $amount
96 );
97 if ($paid) {
98 $who->{bank_balance} -= $pay;
99 } else {
100 $amount = 0;
101 }
102 return "Withdrew $amount $currency";
103 } else {
104 return "You don't have that much money on your bank account.";
105 }
106 }
107 }
108
109 sub help {
110 my ($command) = @_;
111
112 if ($command eq "") {
113 return "You can:
114 deposit <amount> <currency>
115 withdraw <amount> <currency>
116 balance
117 exchange <amount> <direction>
118 help <topic>";
119 } elsif ($command eq "deposit") {
120 return "You can deposit some of the money you don't currently use in our bank. To do this, ask me to:
121 deposit <amount> <currency>\nSee help exchange for our currencies.";
122 } elsif ($command eq "withdraw") {
123 return "To get the money you stored in our system back, just say:
124 withdraw <amount> <currency>";
125 } elsif ($command eq "balance") {
126 return "I can tell you how much money you are saving in our bank, just ask me about your balance.";
127 } elsif ($command eq "exchange") {
128 return "We exchange between royalties and platina coins at a very low price. To change from platina to royalties, say:
129 exchange <amount> platina royalty\nTo change from royalties to platina, say:
130 exchange <amount> royalty platina\nWe currently only exchange between these two currencies. If you want to know more about exchange rates, ask me:
131 help exchange rates\nThanks for using our bank.";
132 } elsif ($command eq "exchange rates") {
133 my @units = sort { $unit{$b} <=> $unit{$a} } keys %unit;
134 my $exchange_rates = "Here is a list of exchange rates:\n";
135
136 for my $from_cur_nr (0 .. $#units) {
137 for my $to_cur_nr ($from_cur_nr+1 .. $#units) {
138 $exchange_rates = $exchange_rates."One $units[$from_cur_nr] is ".calc_exchange_rate(1, $units[$from_cur_nr], $units[$to_cur_nr])." $units[$to_cur_nr]\n";
139 }
140 }
141 return $exchange_rates."This may change a bit with the stock markets but don't expect it to be much.";
142 }
143 }
144
145 sub on_say {
146 my ($event, $ob, $who, $msg) = @_;
147 my ($cmd, $arguments) = split /\s+/, $msg, 2;
148 my ($amount, $currency) = split /\s+/, $arguments, 2;
149 my $name = $ob->name;
150 my $service_charge = 5;
151 my @units = sort keys %unit;
152 my $units = join ", ", @units;
153 my $fees = - ($service_charge / 100) + 1;
154
155 # Have some aliases for currencies
156 if ($currency eq "platinum") {
157 $currency = "platina";
158 } elsif ($currency eq "royalties") {
159 $currency = "royalty";
160 }
161
162 if ($cmd eq "balance") {
163 if ($who->flag (cf::FLAG_WIZ)) {
164 if (my $player = cf::player::find $arguments) {
165 $who->message ("$name says: ".balance ($player->ob, 1), cf::NDI_WHITE);
166 }
167 } else {
168 $who->message ("$name says: ".balance ($who, 0), cf::NDI_WHITE);
169 }
170
171 } elsif ($cmd eq "balance" and !$arguments) {
172 $who->message ("$name says: Balance of whom?", cf::NDI_WHITE);
173
174 } elsif ($cmd eq "deposit" and $currency) {
175 $who->message ("$name says: " . (transaction $who, "deposit", $amount, $currency), cf::NDI_WHITE);
176 $who->message ("$name says: " . (balance $who), cf::NDI_WHITE);
177
178 } elsif ($cmd eq "deposit" and $amount and $currency eq "") {
179 $who->message ("$name says: Deposit $amount of what: $units", cf::NDI_WHITE);
180
181 } elsif ($cmd eq "deposit" and $amount eq "" and $currency eq "") {
182 $who->message ("$name says: How much do you want to deposit?", cf::NDI_WHITE);
183
184 } elsif ($cmd eq "withdraw" and $currency) {
185 $who->message ("$name says: " . (transaction $who, "withdraw", $amount, $currency), cf::NDI_WHITE);
186 $who->message ("$name says: " . (balance $who), cf::NDI_WHITE);
187
188 } elsif ($cmd eq "withdraw" and $amount and $currency eq "") {
189 $who->message ("$name says: Withdraw $amount of what: $units", cf::NDI_WHITE);
190
191 } elsif ($cmd eq "withdraw" and $amount eq "" and $currency eq "") {
192 $who->message ("$name says: How much do you want to withdraw?", cf::NDI_WHITE);
193
194 } elsif ($cmd eq "exchange") {
195 $who->message ("$name says: This function is not yet implemented. Ask me again later.", cf::NDI_WHITE);
196
197 } elsif ($cmd eq "help" or $cmd eq "yes" and $arguments eq "") {
198 $who->message ("$name says: " . (help $arguments), cf::NDI_WHITE);
199
200 } elsif ($cmd eq "help" or $cmd eq "yes" and $arguments ne "") {
201 $who->message ("$name says: " . (help), cf::NDI_WHITE);
202
203 } else {
204 $who->message ("$name says: Do you need help?", cf::NDI_WHITE);
205 }
206 }
207