blob: 53074d0f12cf80d8c1be83ca957360702f8c06a9 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// zentralbank.c -- Zentrale Geld-Verwaltung der Haendler im MG
4// $Id: zentralbank.c 9223 2015-05-27 21:46:58Z Zesstra $
5//
6/*
7 * $Log: zentralbank.c,v $
8 * Revision 1.5 2003/12/30 11:17:34 Vanion
9 * query_prevent_shadow fehlte. Danke fuer den Hinweis an Ogo.
10 *
11 * Revision 1.4 2003/12/30 11:12:02 Jof
12 * Ich hab Dir das File mal geklaut.
13 * Vanion
14 *
15 * Revision 1.3 1995/07/10 07:31:04 Jof
16 * typo fixed
17 *
18 * Revision 1.2 1995/07/10 07:27:59 Jof
19 * Use bank.h
20 * _query_current_money
21 *
22 * Revision 1.1 1995/07/05 16:29:26 Jof
23 * Initial revision
24 *
25 */
26#pragma no_shadow
27#pragma no_clone
28#pragma no_inherit
29#pragma strong_types,save_types
30
31#include <wizlevels.h>
32#include <properties.h>
33#include <money.h>
34
35#define NEED_PROTOTYPES
36#include <bank.h>
37
38#define TIME strftime("%H:%M",time())
39#define LS 1000000
40
41int allmoney,bank_default_percent,store_default_percent,shop_default_percent;
42int falling;
43// Geldmengen: in NPC, in Boersen, rumliegen, auf Seherkarten, Gesamtsumme,
44// Zeitpunkt der Berechnung.
45int *summen = ({0,0,0,0,0,0});
46
47nosave int last_save;
48nosave int counter;
49
50void save_me()
51{
52 save_object("/p/daemon/save/zentralbank");
53 last_save=time();
54}
55
56protected void create()
57{
58 seteuid(getuid());
59 allmoney=500000;
60 bank_default_percent=BANK_DEFAULT_PERCENT;
61 store_default_percent=STORE_PERCENT_LEFT;
62 shop_default_percent=SHOP_PERCENT_LEFT;
63 restore_object("/p/daemon/save/zentralbank");
64}
65
66private void adjust_percents()
67{
68 if (allmoney<50000 && falling>=0) falling=-1;
69 if (allmoney>1000000 && falling<=0) falling=1;
70 if (allmoney<200000 && falling>0 ) falling=0;
71 if (allmoney>80000 && falling<0 ) falling=0;
72 if (falling<0 && !((++counter)%5))
73 {
74 bank_default_percent=bank_default_percent+random(3)+1;
75 store_default_percent=store_default_percent+random(3)+1;
76 shop_default_percent=shop_default_percent+random(3)+1;
77 log_file("ZENTRALBANK",
78 sprintf("%s: PERCENTS SET TO BANK %d STORE %d SHOP %d\n",
79 TIME,bank_default_percent,store_default_percent,
80 shop_default_percent),LS);
81 }
82 if (falling>0)
83 {
84 bank_default_percent/=2;
85 store_default_percent/=2;
86 shop_default_percent/=2;
87 log_file("ZENTRALBANK",
88 sprintf("%s: PERCENTS SET TO BANK %d STORE %d SHOP %d\n",
89 TIME,bank_default_percent,store_default_percent,
90 shop_default_percent),LS);
91 }
92 if (bank_default_percent<1) bank_default_percent=1;
93 if (bank_default_percent>90) bank_default_percent=90;
94 if (store_default_percent<1) store_default_percent=1;
95 if (store_default_percent>90) store_default_percent=90;
96 if (shop_default_percent<1) shop_default_percent=1;
97 if (shop_default_percent>90) shop_default_percent=90;
98 save_me();
99}
100
101void reset()
102{
103 adjust_percents();
104}
105
106private void real_log()
107{
108 log_file("ZBANKSTATUS",sprintf("%s: %d\n",dtime(time()),allmoney),LS);
109}
110
111private void log_state()
112{
113 // nur alle 15min nen Status-Logeintrag. Reicht voellig.
114 if (find_call_out(#'real_log) == -1)
115 call_out(#'real_log,900);
116}
117
118public varargs void PayIn(int amount, int percent)
119{
120 if (amount<=0) return;
121 percent|=bank_default_percent;
122 allmoney+=amount*percent/100;
123 log_file("ZENTRALBANK",
124 sprintf("%s: Einzahlung: %d (%d brutto) von %O\n",
125 TIME,amount*percent/100,amount,previous_object()),LS);
126 log_state();
127}
128
129public int WithDraw(int amount)
130{
131 int got;
132
133 if (amount<=0) return 0;
134 if (allmoney<0) allmoney=0;
135 if (!allmoney)
136 got=0;
137 else
138 {
139 if (amount*3<allmoney)
140 got=amount;
141 else
142 {
143 got=allmoney/3;
144 if (!got) got=1;
145 }
146 allmoney-=got;
147 }
148 log_file("ZENTRALBANK",sprintf("%s: Abhebung: %6d/%6d von %O\n",
149 TIME,got, amount,previous_object()),LS);
150 log_state();
151 return got;
152}
153
154int _query_current_money()
155{
156 return allmoney;
157}
158
159int _query_bank_default_percent()
160{
161 return bank_default_percent;
162}
163
164int _query_shop_percent_left()
165{
166 return shop_default_percent;
167}
168
169int _query_store_percent_left()
170{
171 return store_default_percent;
172}
173
174// Geldmenge im Spiel
175public int *geldmenge() {
176
177 if (summen[5] > time()-3600 || !IS_ELDER(this_player()))
178 return summen;
179
180 summen = allocate(6);
181 object *geld = clones(GELD,2);
182 foreach(object ob: geld) {
183 if (!environment(ob) || IS_LEARNER(environment(ob)))
184 continue;
185 if (environment(ob)->QueryProp(P_NPC))
186 // in NPC
187 summen[0]+=ob->QueryProp(P_AMOUNT);
188 else if (load_name(environment(ob)) == BOERSE)
189 // in boersen
190 summen[1]+=ob->QueryProp(P_AMOUNT);
191 else
192 // sonst rumliegend
193 summen[2]+=ob->QueryProp(P_AMOUNT);
194 }
195 // Seherkarten
196 geld = clones(SEHERKARTE,2);
197 mapping cards=m_allocate(sizeof(geld),1);
198 foreach(object ob: geld) {
199 cards[ob->query_owner()] = ob->QueryProp(P_AMOUNT);
200 }
201 foreach(string owner, int amount: cards)
202 summen[3]+=amount;
203 summen[4]=summen[0]+summen[1]+summen[2]+summen[3];
204 summen[5]=time();
205 return summen;
206}
207
208public void PrintGeldmenge() {
209 int *sum = geldmenge();
210 printf("NPC: %d\n"
211 "Boersen: %d\n"
212 "rumliegend: %d\n"
213 "Seherkarten: %d\n"
214 "Gesamt: %d\n"
215 "Zeit: %s\n",
216 sum[0],sum[1],sum[2],sum[3],sum[4],strftime(sum[5]));
217}
218
219void set_percents(int store,int shop,int bank)
220{
221 store_default_percent=store;
222 shop_default_percent=shop;
223 bank_default_percent=bank;
224 log_file("ZENTRALBANK",
225 sprintf("%s: PERCENTS SET TO BANK %d STORE %d SHOP %d\n",
226 TIME,bank_default_percent,store_default_percent,
227 shop_default_percent),LS);
228}
229
230int remove()
231{
232 save_me();
233 destruct(this_object());
234 return 1;
235}
236