blob: 5fa54ebaa45b253b354fdb429c0c9a2c12150cb2 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001#pragma strong_types,rtt_checks
2
3inherit "/std/container";
4
5#define U_REQ "u_req"
6
7#include <properties.h>
8#include <language.h>
9#include <defines.h>
10#include <moving.h>
11#include <money.h>
12
13// zum debuggen und extra public
14public string debugmode;
15public string __set_debug(string recv) {return debugmode=recv;}
16#include <living/comm.h>
17#define ZDEBUG(x) if (stringp(debugmode) && find_player(debugmode)) \
18 find_player(debugmode)->ReceiveMsg(x,MT_DEBUG,0,object_name()+": ",ME)
19//#define ZDEBUG(x)
20
21int dontacceptmoney;
22
23protected void create()
24{
25 ::create();
26 SetProp(P_NAME, "Geldboerse");
27 SetProp(P_SHORT, "Eine Geldboerse");
Arathorn8f49df62018-01-05 23:54:22 +010028 SetProp(P_LONG, "Eine schoene, aus Leder gefertigte Geldboerse.\n");
MG Mud User88f12472016-06-24 23:31:02 +020029 SetProp(P_MATERIAL, ([MAT_LEATHER:100]));
30 SetProp(P_GENDER, FEMALE);
31 SetProp(P_VALUE, 80);
32 SetProp(P_WEIGHT, 300);
33 SetProp(P_WEIGHT_PERCENT, 50);
34 SetProp(P_MAX_WEIGHT, 250000); // 1 mio. Muenzen.
35 AddId(({"geldboerse", "boerse", BOERSEID}));
36 SetProp(P_NOINSERT_MSG,
37 "Du kannst immer nur eine Geldboerse gleichzeitig benutzen.\n");
38}
39
40static string _query_keep_on_sell()
41{
42 if (first_inventory() && living(environment()))
43 return getuid(environment());
44 return Query(P_KEEP_ON_SELL);
45}
46
47static int _query_amount()
48{
49 object ob = first_inventory();
50 if (load_name(ob) == GELD)
51 return ob->QueryProp(P_AMOUNT);
52 return 0;
53}
54
55void AddAmount(int am)
56{
57 object ob = first_inventory();
58 if (load_name(ob) == GELD)
59 ob->AddAmount(am);
60}
61
62string short()
63{
64 int i;
65 switch (i=QueryProp(P_AMOUNT)) {
66 case 0: return "Eine leere Geldboerse.\n";
67 case 1: return "Eine Geldboerse mit einer Muenze.\n";
68 default: return "Eine Geldboerse mit "+i+" Muenzen.\n";
69 }
MG Mud User88f12472016-06-24 23:31:02 +020070}
71
72// Geld darf nur rein, wenn diese Boerse schon Geld enthaelt
73// ODER es auch keine andere im lebenden (!) Inventar gibt, die Geld
74// enthaelt.
75private int accept_money()
76{
77 // wenn wir gerade zerstoert werden, ist das hier gesetzt, dann akzeptieren
78 // wir ein Geld. Sonst wurde Geld, was gerade in prepare_destruct()
79 // rausbewegt wurde, evtl. wieder reinbewegt...
80 if (dontacceptmoney)
81 return 0;
82 // Ausserhalb von Livings geht reinstecken von Geld immer.
83 if (!living(environment()))
84 return 1;
85 // wenn in uns Geld ist, auch.
86 object geld = first_inventory();
87 if (geld && load_name(geld) == GELD)
88 return 1; // erlaubt
89 // wir haben kein Geld... Wenn es eine mit Geld im gleichen inv gibt,
90 // nehmen wir keins.
91 object andereboerse = present(GELDBOERSE_MIT_GELD, environment());
92 if (objectp(andereboerse))
93 return 0;
94
95 return 1;
96}
97
98varargs int PreventInsert(object ob)
99{
100 if (ob && load_name(ob)==GELD
101 && accept_money())
102 {
103 return ::PreventInsert(ob);
104 }
105 return 1; // nur geld erlaubt
106}
107
108public void MergeMoney(object geld)
109{
110 if (geld && previous_object() == geld
111 && load_name(geld) == GELD
112 && accept_money())
113 {
114 int fremdamount = geld->QueryProp(P_AMOUNT);
115 // Da wir aus einen NotifyMove (d.h. move()) gerufen werden, darf hier
116 // keinesfalls ein move() gemacht werden.
117 // Wenn in uns Geld ist, prima, einfach P_AMOUNT veraendern.
118 // Wenn nicht, muessen wir ein neues Geldobjekt clonen, falls fremdamount
119 // > 0 ist.
120 object meingeld = first_inventory();
121 if (meingeld && load_name(meingeld) == GELD)
122 {
123 int meinamount = meingeld->QueryProp(P_AMOUNT);
124 ZDEBUG(sprintf("MergeMoney: meinamount: %d, fremdamount: %d\n",
125 meinamount,fremdamount));
126 // wenn fremdamount positiv ist, vereinigen wir uns natuerlich, auch
127 // wenn mein Geld negativ ist. Aber max. 1 Mio. Muenzen aufnehmen.
128 if (fremdamount > 0)
129 {
130 int zubuchen = min(1000000-meinamount, fremdamount);
131 ZDEBUG(sprintf("MergeMoney: zubuchen: %d\n", zubuchen));
132 meingeld->SetProp(P_AMOUNT, meinamount + zubuchen);
133 geld->SetProp(P_AMOUNT, fremdamount - zubuchen);
134 // environment verstaendigen ueber Inventaraenderung... Und uns. Wir
135 // machen nur die beiden, weil alle hoehren Envs nicht so wichtig
136 // sind, dass es sofort gemacht werden muss.
137 environment()->_set_last_content_change();
138 _set_last_content_change();
139 }
140 // ansonsten vereinigen wir uns, wenn meinamount > 0 und fremdamount < 0
141 // ist, aber nur soviel, dass hinterher in mir nix mehr verbleibt.
142 else if (meinamount > 0 && fremdamount < 0)
143 {
144 int amount_to_merge = min(meinamount, abs(fremdamount));
145 ZDEBUG(sprintf("MergeMoney: zubuchen: %d\n", amount_to_merge));
146 meingeld->SetProp(P_AMOUNT, meinamount - amount_to_merge);
147 geld->SetProp(P_AMOUNT, fremdamount + amount_to_merge);
148 // environment verstaendigen ueber Inventaraenderung... Und uns. Wir
149 // machen nur die beiden, weil alle hoehren Envs nicht so wichtig
150 // sind, dass es sofort gemacht werden muss.
151 environment()->_set_last_content_change();
152 _set_last_content_change();
153 }
154 // in anderen Faellen vereinigen wir einfach nicht (beide negativ)
155 }
156 // Ansonsten nehmen wir nur positives Geld und nur, soweit es noch
157 // reinpasst.
158 else if (fremdamount > 0)
159 {
160 ZDEBUG(sprintf("MergeMoney: leere Boerse, fremdamount: %d\n",
161 fremdamount));
162 meingeld = clone_object(GELD);
163 // nocheck, weil wir eigentlich <geld> bewegen wollen und schon
164 // festgestellt haben, dass diese Boerse Geld akzeptiert. Tragen kann
165 // der Spieler es auch (sogar ohne Gewichtsreduktion). Die Boerse soll
166 // max. 1Mio Muenzen aufnehmen.
167 int zubuchen = min(fremdamount,1000000);
168 ZDEBUG(sprintf("MergeMoney: zubuchen: %d\n", zubuchen));
169 meingeld->SetProp(P_AMOUNT, zubuchen);
170 geld->SetProp(P_AMOUNT, fremdamount-zubuchen);
171 meingeld->move(this_object(), M_NOCHECK);
172 // environment verstaendigen ueber Inventaraenderung durch geld->SetProp
173 environment()->_set_last_content_change();
174 }
175 ZDEBUG(sprintf("MergeMoney: Final: meinamount: %d, fremdamount: %d\n",
176 meingeld->QueryProp(P_AMOUNT),geld->QueryProp(P_AMOUNT)));
177 }
178}
179
180varargs int remove(int silent)
181{
182 dontacceptmoney=1;
183 return ::remove(silent);
184}
185
186varargs int id(string str, int lvl)
187{
188 if (str==GELDBOERSE_MIT_GELD
189 && load_name(first_inventory()) == GELD)
190 return 1;
191 return ::id(str, lvl);
192}
193