blob: 8f011edcba66071ad4f16cdb1614e38132b7de7f [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// block.c -- Hier sammeln sich die Raten fuer das Seherhaus
2//
3// (c) 1994 Wargon@MorgenGrauen
4//
5// $Id: block.c,v 1.2 2003/11/15 13:56:01 mud Exp $
6//
7#include <properties.h>
8#include <language.h>
9#include <moving.h>
10#include <combat.h>
11#include "haus.h"
12
13inherit "std/clothing";
14
15private nosave int shadowing;
16
17create()
18{
19 if (!clonep(this_object())) return;
20
21 ::create();
22
23 SetProp( P_SHORT, "Der MG MASTER-BLOCK" );
24 SetProp( P_NAME, "MASTERBLOCK" );
25 SetProp( P_WEIGHT, 100 );
26 SetProp( P_GENDER, MALE );
27 SetProp( P_NODROP, 1 );
28 SetProp( P_NEVERDROP, 1 );
29 // wenn es keinen TP gibt, muss das Ding per SetProp(P_AUTOLOADOBJ)
30 // konfiguriert werden, nicht hier. Zesstra, 20.10.2007
31 if (objectp(this_player()))
32 Set( P_AUTOLOADOBJ, ({ 0, this_player()->QueryProp(P_AGE) + MAX_TIME,
33 MAX_TIME/2, B_EP }) );
34 Set( P_AUTOLOADOBJ, SECURED, F_MODE );
35 SetProp( P_NOBUY, 1 );
36 SetProp(P_MATERIAL, MAT_MARBLE);
37
38 SetProp(P_WEAR_FUNC, this_object());
39 SetProp(P_REMOVE_FUNC, this_object());
40
41 AddId( ({ "block", "masterblock", "master-block", "MG MASTER-BLOCK", "mg master-block", "\n block" }) );
42
43 AddCmd( "", "remindMe", 1);
44}
45
46int query_prevent_shadow(object ob)
47{
48 HLOG("SHADOW", sprintf("%s, von %O im Block.\n",dtime(time())[5..], ob));
49 return 1;
50}
51
52int
53WearFunc(object me)
54{
55 if (!shadowing && (Query(P_AUTOLOADOBJ)[V_FLAGS] & B_ACTIVE) ) {
56 clone_object("/std/player/shadows/block_shadow");
57 shadowing = 1;
58 }
59 return 1;
60}
61
62int
63RemoveFunc(object me)
64{
65 // manchmal gibts keinen TP und machmal ist TP nicht der Spieler, der den
66 // Block traegt.
67 if (this_player() && this_player() == environment()) {
68 shadowing = 0;
69 this_player()->SeherHatGenug();
70 return 1;
71 }
72 return 0;
73}
74
75static int
76_query_value()
77{
78 return( Query(P_AUTOLOADOBJ)[0] );
79}
80
81static int
82_query_cursed()
83{
84 return 0;
85}
86
87static int
88_set_schwer(int schwer)
89{
90 int *al;
91
92 al = Query(P_AUTOLOADOBJ);
93 if (schwer && !(al[V_FLAGS] & B_FAST)) {
94 al[V_DLINE] -= MAX_TIME/2;
95 al[V_WTIME] /= 2;
96 al[V_FLAGS] |= B_FAST;
97 }
98 else if (!schwer && (al[V_FLAGS] & B_FAST)) {
99 al[V_DLINE] += MAX_TIME/2;
100 al[V_WTIME] *= 2;
101 al[V_FLAGS] &= ~B_FAST;
102 }
103 Set( P_AUTOLOADOBJ, al[0..]);
104 return al[V_FLAGS] & B_FAST;
105}
106
107static int
108_query_schwer()
109{
110 return (Query(P_AUTOLOADOBJ)[V_FLAGS] & B_FAST);
111}
112
113static mixed
114_set_autoloadobj(mixed al)
115{
116 object ti;
117
118 if ((ti = this_interactive()) && old_explode(object_name(ti),"#")[0] != "/secure/login")
119 HLOG("SET_AL",sprintf("Block: TI = %O, ENV = %O\n",this_interactive(), environment()));
120
121 /* Kompatibilitaet... */
122 if (pointerp(al) && !(al[V_FLAGS] & B_EP)) {
123 al[V_MONEY] *= 4;
124 al[V_FLAGS] |= B_EP;
125 }
126 return Set(P_AUTOLOADOBJ, al);
127}
128
129static string
130_query_long()
131{
132 int *al;
133 int laufzeit, einzahlung;
134 int ratenhoehe;
135 string ret;
136
137 al = Query(P_AUTOLOADOBJ);
138 ret = "Dies ist der MG MASTER-BLOCK. Er besteht aus massivem Marmor, um die Sicher-\n"
139 +"heit der eingezahlten Rate zu gewaehrleisten. Mit einem Goldkettchen versehen,\n"
140 +"kann man ihn tragen wie ein Amulett. Dies ist auch noetig, wenn auf den Block\n"
141 +"eingezahlt werden soll.\n";
142
143 ratenhoehe = RATENHOEHE;
144 if (al[V_FLAGS] & B_EXTEND)
145 ratenhoehe += (RATENHOEHE*6)/10;
146 laufzeit = 2*(al[V_DLINE]-this_player()->QueryProp(P_AGE));
147 einzahlung = al[V_MONEY];
148
149 if (laufzeit < 0)
150 ret += "Leider hast Du die Zahlung dieser Rate verpasst!\n";
151 else {
152 if (einzahlung >= ratenhoehe)
153 ret += "Er ist vollstaendig mit der Rate gefuellt.\n";
154 else
155 ret += sprintf( "Du hast bis jetzt %d (von %d) Punkten eingezahlt.\n", einzahlung, ratenhoehe );
156
157 ret += time2string("Diese Rate muss bis in %h %H, %m %M und %s %S abbezahlt sein!\n", laufzeit);
158 }
159 return ret;
160}
161
162static int
163remindMe()
164{
165 int noch, next, *al, ratenhoehe;
166 object vertrag;
167
168 al = Query(P_AUTOLOADOBJ);
169 next = al[V_WTIME];
170 ratenhoehe = RATENHOEHE;
171 if (al[V_FLAGS] & B_EXTEND)
172 ratenhoehe += (RATENHOEHE*6)/10;
173
174 if (al[V_MONEY] < ratenhoehe) {
175 noch = al[V_DLINE]-this_player()->QueryProp(P_AGE);
176 if (noch >= 0) {
177 if (next > noch) {
178 call_out("doRemind", 0, this_player(), time2string( "Die naechste Rate wird in %h %H, %m %M und %s %S faellig!\n", 2*noch));
179 do next -= WARN_TIME; while (next>0 && next>noch);
180 if (next < 0)
181 next = 0;
182 al[V_WTIME] = next;
183 Set(P_AUTOLOADOBJ, al[0..]);
184 }
185 }
186 else {
187 if (al[V_FLAGS] & B_EXTEND) {
188 string s;
189
190 write( "Du hast die Strafrate nicht bezahlt!\n" );
191 if (vertrag = present( "sehe\rvertrag", this_player())) {
192 write( "Damit verfaellt auch Dein Bausparvertrag! Und das im wahrsten Sinne des\nWortes...\n" );
193 vertrag->remove();
194 }
195 s = "Block: "+getuid(this_player())+" hat ueberzogen... ;)\n";
196 HLOG(getuid(this_player()), s);
197 HLOG("BANK.LOG", s);
198 remove(1);
199 }
200 else {
201 write( "Du hast die letzte Ratenzahlung verpasst!\n"
202 +"Die Ratenhoehe erhoeht sich um die Strafgebuehr.\n" );
203 al[V_FLAGS] |= B_EXTEND;
204 if (al[V_FLAGS] & B_FAST) {
205 al[V_DLINE] += MAX_TIME/4;
206 al[V_WTIME] = MAX_TIME/8;
207 }
208 else {
209 al[V_DLINE] += MAX_TIME/2;
210 al[V_WTIME] = MAX_TIME/4;
211 }
212 Set( P_AUTOLOADOBJ, al[0..]);
213 }
214 }
215 }
216
217 return 0;
218}
219
220int
221Gutschreiben(int money)
222{
223 int back, ratenhoehe;
224 mixed al;
225
226 if (!QueryProp(P_WORN)) // Zum Gutschreiben muss der Block getragen werden!
227 return money;
228
229 al = Query(P_AUTOLOADOBJ);
230 back = 0;
231
232 ratenhoehe = RATENHOEHE;
233 if (al[V_FLAGS] & B_EXTEND)
234 ratenhoehe += (RATENHOEHE*6)/10;
235
236 if (old_explode(object_name(previous_object()),"#")[0] != "/std/player/shadows/block_shadow") {
237 mixed env;
238
239 env = environment();
240 if (env)
241 env = getuid(env);
242 else
243 env = "BANK.LOG";
244 HLOG(env, sprintf("Block: Gutschrift von aussen (%d EP), TI = %O)!\n", money, this_interactive()));
245 }
246 al[V_MONEY] += money;
247 if (al[V_MONEY] >= ratenhoehe) { // genug eingezahlt...
248 back = al[V_MONEY]-ratenhoehe;
249 al[V_MONEY] = ratenhoehe;
250 al[V_FLAGS] &= ~B_ACTIVE;
251 money -= back;
252 call_out("blockVoll",0,environment());
253 }
254
255 Set(P_AUTOLOADOBJ, al[0..]);
256
257 return back;
258}
259
260void
261blockVoll(object pl)
262{
263 tell_object(pl, "Der Block fuer diese Rate ist jetzt voll!\n");
264 pl->SeherHatGenug(); // shadow entfernen
265}
266
267void
268doRemind(object pl, string str)
269{
270 tell_object(pl, str);
271}
272
273protected int PreventMove(object dest, object oldenv, int method) {
274 if (previous_object() && previous_object()->QueryBuyFact()) // Im Laden...
275 return ME_CANT_BE_DROPPED;
276 return ::PreventMove(dest, oldenv, method);
277}
278
279protected void NotifyMove(object dest, object oldenv, int method) {
280
281 if (oldenv || (object_name(previous_object()) != PATH+"sb_antrag" &&
282 object_name(previous_object()) != PATH+"sb_einzahlung" &&
283 object_name(previous_object()) != object_name(dest)))
284 HLOG("MOVING", sprintf("Block: von %O -> %O mit %O (%O)\n",
285 environment(), dest,
286 previous_object(), getuid(previous_object())));
287
288 return ::NotifyMove(dest, oldenv, method);
289}
290
291int
292remove(int silent)
293{
294 if (clonep(this_object()) && environment())
295 environment()->SeherHatGenug();
296
297 return ::remove(silent);
298}
299
300// $Log: block.c,v $
301// Revision 1.2 2003/11/15 13:56:01 mud
302// MAT_MARBLE
303//
304// Revision 1.1.1.1 2000/08/20 20:22:42 mud
305// Ins CVS eingecheckt
306//
307// Revision 1.4 1994/12/17 15:56:58 Wargon
308// Etwas mehr Sicherheit gegen Zugriffe von aussen.
309//
310// Revision 1.3 1994/10/21 09:50:20 Wargon
311// long()->_query_long()
312// Shadow wird nur aktiv, wenn der Block gezueckt ist.
313//
314// Revision 1.2 1994/10/09 21:04:27 Wargon
315// Man kann jetzt einstellen, ob der Block zu einem leichten, aber
316// teureren oder zu einem schweren, aber billigeren Vertrag gehoert.
317// Falls man eine Rate verpasst hat, verfaellt damit auch der Ver-
318// trag.
319// Gutgeschrieben wird nur, wenn der Block gezueckt ist.
320// Gutschreiben() liefert ueberzaehliges Geld zurueck.
321//
322// Revision 1.1 1994/10/07 14:35:34 Wargon
323// Initial revision
324//