blob: 4a9a5f4984f968a7ccc44b53e8568ec525fbd8df [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// money.c -- Unser Geld
4//
5// $Id: money.c 8893 2014-08-04 19:48:56Z Zesstra $
6
7inherit "/std/unit";
8
9#pragma strong_types,rtt_checks
10
11#include <properties.h>
12#include <language.h>
13#include <defines.h>
14#include <unit.h>
15#include <money.h>
16
17// zum debuggen (debugmode kommt aus /std/unit.c
18#include <living/comm.h>
19#define ZDEBUG(x) if (stringp(debugmode) && find_player(debugmode)) \
20 find_player(debugmode)->ReceiveMsg(x,MT_DEBUG,0,object_name()+": ",ME)
21//#define ZDEBUG(x)
22
23protected void NotifyMove(object dest, object oldenv, int method)
24{
25 // Logg-Funktion, um Nicht-Standard-Geldbugs zu finden.
26 // Eingebaut 27.03.2000 - Tiamak
27 // Vor vereinigen mit anderen Geldobjekten in NotifyMove().
28 object moneylog = find_object("/p/daemon/moneylog");
29 if ( (!environment() && previous_object() &&
30 !query_once_interactive(previous_object()) &&
31 load_name(previous_object()) != GELD) &&
32 moneylog)
33 moneylog->AddMoney( previous_object(), Query(U_REQ) );
34
35 // Hier passiert Vereinigung mit anderen Geldobjekten... Etc.
36 ::NotifyMove(dest, oldenv, method);
37
38 // Zu diesem Zeitpunkt sind Vereinigungen mit anderen Geldobjekten in dest
39 // schon gelaufen, hier muessen jetzt noch Geldboersen und Seherkarten
40 // beruecksichtigt werden.
41 // Sollverhalten ist:
42 // Vereinigung mit Boersen+geldkarten nur in Lebewesen.
43 // Ausserdem soll nicht vereinigt werden, wenn man muenzen aus einer Boerse
44 // nimmt.
45 // A) Betrag ist positiv:
46 // A1) mit der ersten geld-enhaltenen Geldboerse im Inventar vereinigen.
47 // Gibt es keine geld-gefuellte, wird die erste leere genommen.
48 // B) Betrag ist negativ:
49 // Es wird versucht, mit geldgefuellten Boersen und aktiven Seherkarten
50 // (d.h. Karten, diesem Environment gehoeren) zu vereinigen.
51 // Es wird erst einer Boersen "abgebucht" (falls vorhanden) und dann
52 // (falls noch noetig) von einer Geldkarte. Ist der Betrag am Ende
53 // negativ, wird ein Fehler ausgeloest.
54 if (!living(dest))
55 return;
56 // wenn wir aus einer Boerse in diesem Environment kommen, vereinigen wir
57 // uns nicht wieder erneut.
58 if (load_name(oldenv) == BOERSE
59 && environment(oldenv) == environment())
60 return;
61
62 int amount = QueryProp(P_AMOUNT);
63 ZDEBUG(sprintf("NotifyMove 1: amount: %d\n",
64 amount));
65 if (amount > 0)
66 {
67 object boerse = present(GELDBOERSE_MIT_GELD, environment())
68 || present(BOERSEID, environment());
69 if (boerse)
70 {
71 boerse->MergeMoney(this_object());
72 // Sollten wir jetzt P_AMOUNT == 0 haben, zerstoert uns der Code aus
73 // unit.c spaeter.
74 ZDEBUG(sprintf("NotifyMove nach Boersenvereinigung 1: amount: %d\n",
75 QueryProp(P_AMOUNT)));
76 }
77 }
78 else if (amount < 0)
79 {
80 object boerse = present(GELDBOERSE_MIT_GELD, environment());
81 if (boerse)
82 {
83 boerse->MergeMoney(this_object());
84 ZDEBUG(sprintf("NotifyMove nach Boersenvereinigung 2: amount: %d\n",
85 QueryProp(P_AMOUNT)));
86 }
87 // wenn immer noch was auszugleichen ist, Geldkarte versuchen.
88 if (QueryProp(P_AMOUNT) < 0)
89 {
90 object geldkarte = present(SEHERKARTEID_AKTIV, environment());
91 if (geldkarte)
92 {
93 geldkarte->MergeMoney(this_object());
94 ZDEBUG(sprintf("NotifyMove nach Kartenvereinigung: amount: %d\n",
95 QueryProp(P_AMOUNT)));
96 }
97 }
98 if (QueryProp(P_AMOUNT) < 0)
99 catch(raise_error(sprintf(
100 "Geld mit negativem Betrag immer noch negativ nach "
101 "Vereinigung mit allen Geldquellen im Inventar: %O. Rest: %d\n",
102 environment(), QueryProp(P_AMOUNT))); publish);
103 }
104}
105
106int _set_autoloadobj( mixed args )
107{
108 if (pointerp(args))
109 args=args[0];
110 if (stringp(args))
111 sscanf(args,"%d",args);
112 if (!intp(args))
113 args=0;
114 return SetProp(P_AMOUNT,args);
115}
116
117int _query_autoloadobj()
118{
119 return (int)Query(P_AMOUNT, F_VALUE);
120}
121
122string current_long() {
123 int r;
124 r=Query(U_REQ);
125 return(break_string(
126 ((r==1)?"":"Du betrachtest eine der Muenzen genauer:\n")+
127 "Die Oberflaeche der Goldmuenze ist vom taeglichen Gebrauch ziemlich "
128 "mitgenommen. Kratzer und sogar Bissspuren zieren die Praegemuenze "
129 "zusaetzlich zum Konterfei "+
130 ({"des Jof","der Rumata","des Zook"})[(Query(P_AMOUNT)+r)%3]+
131 ". Der Rand "+
132 ((!(r%2))?"scheint etwas beschaedigt zu sein.":
133 "ist wenigstens unbeschaedigt."),
134 78,0,BS_LEAVE_MY_LFS));
135}
136
137static int action_schnipps(string str) {
138 if(!id(str)) return 0;
139 write(break_string(
140 ((Query(U_REQ)==1)?"Du nimmst die Muenze":
141 "Du nimmst eine der Muenzen")+
142 " und schnippst sie in die Luft. Sie klingt hell auf. "+
143 ((this_player() && this_player()->QueryAttribute(A_DEX)>10)?
144 "Geschickt faengst Du sie wieder auf.":
145 "Sie plumpst Dir wieder in die Hand und beinahe laesst Du "
146 "sie fallen."),78));
147 if(this_player() && environment(this_player()))
148 tell_room(environment(this_player()),
149 break_string(this_player()->Name()+" schnippt mit hellem "
150 "Klingen ein Muenze in die Luft und faengt sie "
151 "wieder.",78),
152 ({this_player()}));
153 return 1;
154}
155
156static int action_pruefe(string str) {
157 if(!id(str)) return 0;
158 write(break_string(
159 ((Query(U_REQ)==1)?"Du nimmst die Muenze":
160 "Du nimmst eine der Muenzen")+
161 " und beisst vorsichtig hinein. Dein Zahn versinkt tief im reinen Gold, "
162 "und Du bist Dir nun sicher, dass diese Muenze auch wirklich echt ist.",
163 78));
164 if(this_player() && environment(this_player()))
165 tell_room(environment(this_player()),
166 break_string(this_player()->Name()+" beisst in eine Muenze "
167 "und schaut irgendwie befriedigt drein.",78),
168 ({this_player()}));
169 return 1;
170}
171
172
173static string DetKonterfei() {
174 string m;
175 switch((Query(P_AMOUNT)+Query(U_REQ))%3) {
176 default:
177 case 0:
178 m="Jofs rundes Gesicht grinst Dich vertrauenserweckend und "
179 "freundlich an.";break;
180 case 1:
181 m="Rumata scheint Dir zuzublinzeln.";break;
182 case 2:
183 m="Zooks Gesicht schaut ziemlich frisch gepraegt drein. Wenn "
184 "eine der Muenzen beim Schnippen klingt, dann bestimmt die.";break;
185 }
186 return(break_string(m,78));
187}
188
189
190static string DetRand() {
191 return(break_string(
192 ((!(Query(U_REQ)%2))?
193 "Der Rand der Muenze ist zerklueftet und abgeschabt. Ob "
194 "da jemand versucht hat, das Gold der Muenze abzuschaben, "
195 "um sich etwas nebenher zu verdienen?":
196 "Der Rand ist vollkommen in Ordnung, ein wirklich frische "
197 "Praegung."),78));
198}
199
200
201static int action_wurf(string str)
202{
203 int num, part;
204
205 if (!id(str))
206 return 0;
207
208 num = Query(U_REQ);
209 write (break_string(
210 ((num==1)?"Du nimmst die Muenze":
211 sprintf("Du nimmst %d Muenzen", num))+
212 ", wirfst sie hoch, laesst sie zu Boden prasseln und "
213 "betrachtest das Ergebnis:", 78));
214 if (this_player() && environment(this_player()))
215 tell_room(environment(this_player()),
216 break_string(this_player()->Name()+" wirft "+
217 ((num==1)?"eine Muenze":
218 sprintf("%d Muenzen", num))+
219 " hoch, laesst sie zu Boden prasseln und betrachtet "
220 +"das Ergebnis:", 78), ({this_player()}));
221
222 if (num == 1) {
223 if (random(1000000) == 123456) {
224 write(" Die Muenze bleibt auf dem Rand stehen.\n");
225 if (this_player() && environment(this_player()))
226 tell_room(environment(this_player()),
227 " Die Muenze bleibt auf dem Rand stehen.\n",
228 ({this_player()}));
229 }
230 else if (random(100) < 50) {
231 write(" Kopf.\n");
232 if (this_player() && environment(this_player()))
233 tell_room(environment(this_player()),
234 " Kopf.\n",
235 ({this_player()}));
236 }
237 else {
238 write(" Zahl.\n");
239 if (this_player() && environment(this_player()))
240 tell_room(environment(this_player()),
241 " Zahl.\n",
242 ({this_player()}));
243 }
244 }
245 else {
246 part = 5*num + random(num+1) - random(num+1) // etwas Gauss-verteilen
247 + random(num+1) - random(num+1)
248 + random(num+1) - random(num+1)
249 + random(num+1) - random(num+1)
250 + random(num+1) - random(num+1);
251 part = (part+5)/10;
252
253 if (part) {
254 printf(" %dx Kopf", part);
255 if (part != num)
256 printf(" und %dx Zahl", num-part);
257 if(this_player() && environment(this_player()))
258 tell_room(environment(this_player()),
259 sprintf(" %dx Kopf", part)+
260 ((part!=num)?sprintf(" und %dx Zahl", num-part):"")+
261 ".\n",
262 ({this_player()}));
263 }
264 else {
265 printf(" %dx Zahl", num);
266 if (this_player() && environment(this_player()))
267 tell_room(environment(this_player()),
268 sprintf(" %dx Zahl.\n", num),
269 ({this_player()}));
270 }
271 write (".\n");
272 }
273
274 write(break_string(
275 "Schnell sammelst Du "+
276 ((num==1)?"Deine Muenze":"Deine Muenzen")+" wieder ein.", 78));
277 if (this_player() && environment(this_player()))
278 tell_room(environment(this_player()),
279 break_string(this_player()->Name()+ " sammelt schnell "+
280 ((num==1)?(this_player()->QueryPossPronoun(FEMALE,WEN, SINGULAR)
281 +" Muenze wieder ein."):
282 (this_player()->QueryPossPronoun(FEMALE,WEN, PLURAL)+
283 " Muenzen wieder ein."))), ({this_player()}));
284 return 1;
285}
286
287protected void create()
288{
289 mixed plist, i;
290
291 ::create();
292 SetProp(P_NAME,({"Muenze","Muenzen"}));
293 Set(P_LONG,#'current_long);
294 SetProp(P_SHORT,"Geld");
295 SetProp(P_INFO,"Du hast bei diesem Geld ein sicheres Gefuehl.\n");
296 SetProp(P_MATERIAL,([MAT_GOLD:100]));
297 AddSingularId("muenze");
298 AddPluralId("muenzen");
299 AddSingularId("goldstueck");
300 AddPluralId("goldstuecke");
301 AddId(({"geld", GELDID}));
302 SetProp(P_GENDER,FEMALE);
303 SetCoinsPerUnits(1,1);
304 SetGramsPerUnits(1,4);
305
306 if (!clonep(this_object())) {
307 set_next_reset(-1);
308 return;
309 }
310 AddDetail(({"rand","muenzrand"}),#'DetRand);
311 AddDetail(({"oberflaeche","flaeche"}),break_string(
312 "Diese Muenze ist schon durch viele Haende gegangen. Die Kratzer "
313 "zeugen davon, dass sie nicht selten allein getragen wurde und die "
314 "Bissspuren von mangelndem Vertrauen.",78));
315 AddDetail("kratzer",break_string(
316 "Das Konterfei ist schon ganz schoen zerkratzt.",78));
317 AddDetail(({"bissspur","bissspuren"}),break_string(
318 "Da hat doch tatsaechlich jemand so wenig Vertrauen in das Gold "
319 "gezeigt, dass er hineingebissen hat, um es zu pruefen.",78));
320 AddDetail(({"bild","konterfei","praegung"}),#'DetKonterfei);
321 AddDetail("gold","Es glaenzt Dich verheissungsvoll an.\n");
322
323 AddCmd(({"pruef","pruefe","beiss","beisse","test","teste"}),
324 #'action_pruefe);
325 AddCmd(({"schnipp","schnippe","schnipps","schnippse"}),
326 #'action_schnipps);
327
328 AddCmd( ({ "wirf", "werf", "werfe" }), #'action_wurf);
329}
330
331varargs string GetDetail(mixed key,mixed race,int sense) {
332 string m;
333 if(stringp(m=::GetDetail(&key,&race,&sense)) && sizeof(m)) {
334 int r;
335 r=Query(U_REQ);
336 if(r!=1) m=sprintf("Du betrachtest eine der %d Muenzen genauer:\n",r)+m;
337 }
338 return m;
339}
340