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

# User Rev Content
1 pippijn 1.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 pippijn 1.16 # - exchange, will exchange between royalties and platinum coins
10 pippijn 1.1 # - balance, simply shows how much money one has on his/her account.
11     #
12     # TODO:
13     # - Comment more steps
14 pippijn 1.5 # - Implement exchange()
15 pippijn 1.1
16     # The units are being used in each sub so they are declared globally.
17 pippijn 1.2 my %unit = (
18 root 1.6 silver => 1,
19     gold => 10,
20 pippijn 1.16 platina => 50,
21     royalty => 5000,
22 pippijn 1.1 );
23    
24 pippijn 1.4 # Subroutine just to calculate exchange rates.
25 pippijn 1.2 sub calc_exchange_rate {
26 pippijn 1.1 my ($value, $from_cur, $to_cur) = @_;
27    
28 root 1.6 $value * $unit{$from_cur} / $unit{$to_cur}
29 pippijn 1.1 }
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 pippijn 1.2 sub balance {
36 pippijn 1.10 my ($who, $is_wiz) = @_;
37 pippijn 1.1 my $balance = $who->{bank_balance};
38    
39 pippijn 1.12 unless ($is_wiz) {
40     return "Sorry, you have no balance."
41 pippijn 1.16 unless $balance >= 1;
42 pippijn 1.12 } else {
43     return $who->name." has no balance."
44 pippijn 1.16 unless $balance >= 1;
45 pippijn 1.12 }
46 pippijn 1.1
47 pippijn 1.16 my $royalties = calc_exchange_rate $balance, "silver", "royalty";
48     my $platinum = calc_exchange_rate $royalties - (int $royalties), "royalty", "platina";
49 root 1.6 my $gold = calc_exchange_rate $platinum - (int $platinum), "platina", "gold";
50     my $silver = calc_exchange_rate $gold - (int $gold), "gold", "silver";
51    
52 pippijn 1.12 my $account_info =
53 pippijn 1.16 (int $royalties) . " royalties, "
54 root 1.6 . (int $platinum) . " platinum, "
55     . (int $gold) . " gold and about "
56     . (int $silver) ." silver coins.";
57 pippijn 1.12
58     return "You have $account_info"
59     unless $is_wiz;
60    
61     return $who->name." has $account_info";
62 pippijn 1.1 }
63    
64 pippijn 1.2 sub transaction {
65 pippijn 1.1 my ($who, $action, $amount, $currency) = @_;
66 pippijn 1.3 my $pay = $amount * $unit{$currency};
67 pippijn 1.1
68 root 1.6 return "We don't trade in that currency."
69     unless exists $unit{$currency};
70 pippijn 1.4
71 root 1.6 return "You can not $action fractions."
72     unless $amount =~ /^\d+$/;
73 pippijn 1.5
74 pippijn 1.1 # First check for possible overflow and user stupidity
75 pippijn 1.15 if ($amount > 2**31) {
76     return "Sorry, we do not handle that kind of money for one ".$action.".";
77 pippijn 1.1 } elsif ($amount == 0) {
78     return "You can not ".$action." nothing.";
79     } elsif ($amount < 0) {
80     return "You can not ".$action." negative values.";
81 pippijn 1.4 }
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 pippijn 1.17 if ($pay <= $who->{bank_balance}) {
93 elmex 1.19 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 pippijn 1.1 } else {
100 elmex 1.19 $amount = 0;
101 pippijn 1.1 }
102 pippijn 1.4 return "Withdrew $amount $currency";
103 pippijn 1.16 } else {
104     return "You don't have that much money on your bank account.";
105 pippijn 1.1 }
106     }
107     }
108    
109 pippijn 1.9 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 pippijn 1.16 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 pippijn 1.9 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 pippijn 1.1 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 root 1.6 my $name = $ob->name;
150 pippijn 1.1 my $service_charge = 5;
151 pippijn 1.2 my @units = sort keys %unit;
152 pippijn 1.1 my $units = join ", ", @units;
153     my $fees = - ($service_charge / 100) + 1;
154 pippijn 1.16
155     # Have some aliases for currencies
156 pippijn 1.14 if ($currency eq "platinum") {
157     $currency = "platina";
158 pippijn 1.16 } elsif ($currency eq "royalties") {
159     $currency = "royalty";
160 pippijn 1.14 }
161    
162 pippijn 1.1 if ($cmd eq "balance") {
163 pippijn 1.9 if ($who->flag (cf::FLAG_WIZ)) {
164 pippijn 1.11 if (my $player = cf::player::find $arguments) {
165     $who->message ("$name says: ".balance ($player->ob, 1), cf::NDI_WHITE);
166     }
167 pippijn 1.10 } else {
168     $who->message ("$name says: ".balance ($who, 0), cf::NDI_WHITE);
169 pippijn 1.9 }
170 pippijn 1.1
171 pippijn 1.12 } elsif ($cmd eq "balance" and !$arguments) {
172     $who->message ("$name says: Balance of whom?", cf::NDI_WHITE);
173    
174 root 1.6 } 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 pippijn 1.2 } elsif ($cmd eq "deposit" and $amount and $currency eq "") {
179 root 1.6 $who->message ("$name says: Deposit $amount of what: $units", cf::NDI_WHITE);
180    
181 pippijn 1.1 } elsif ($cmd eq "deposit" and $amount eq "" and $currency eq "") {
182 root 1.6 $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 pippijn 1.1
188 pippijn 1.2 } elsif ($cmd eq "withdraw" and $amount and $currency eq "") {
189 root 1.6 $who->message ("$name says: Withdraw $amount of what: $units", cf::NDI_WHITE);
190    
191 pippijn 1.1 } elsif ($cmd eq "withdraw" and $amount eq "" and $currency eq "") {
192 root 1.6 $who->message ("$name says: How much do you want to withdraw?", cf::NDI_WHITE);
193 pippijn 1.1
194 pippijn 1.14 } elsif ($cmd eq "exchange") {
195     $who->message ("$name says: This function is not yet implemented. Ask me again later.", cf::NDI_WHITE);
196    
197 pippijn 1.7 } elsif ($cmd eq "help" or $cmd eq "yes" and $arguments eq "") {
198 root 1.6 $who->message ("$name says: " . (help $arguments), cf::NDI_WHITE);
199 pippijn 1.4
200 pippijn 1.7 } elsif ($cmd eq "help" or $cmd eq "yes" and $arguments ne "") {
201     $who->message ("$name says: " . (help), cf::NDI_WHITE);
202    
203 root 1.6 } else {
204     $who->message ("$name says: Do you need help?", cf::NDI_WHITE);
205 pippijn 1.4 }
206 pippijn 1.1 }
207